dp求最大最小连续字段

问题:有n个数,在其中选取连续的一段 ,使其和最大。

解决:考虑已知目前第i数之前的部分区间和sum[i-1],如果sum[i-1]大于0的话那么加上前面的可以增加值,但如果小于0的话再增加会减少值,那么舍去前一段区间,从当前数开始重新往后加。中间维护更新一个最大值就好了。

举一反三:同理,最小连续字段则是反过来求。如果求大小的话更新大小,求区间长度的话则维护区间长度,其中需要处理的部分是前一段部分区间和sum[i]=0的情况(到底要不要这一段区间)

int maxsub(int a[]){
     int dp[N],maxx;maxx = dp[0] = a[0];
        for(int i = 1;i < n;++i){
            if(dp[i-1]>0)dp[i] = dp[i-1] + a[i];
            else dp[i] = dp[i-1] + a[i];
            maxx = max(dp[i],max);
    }
    return max;
}

猜你喜欢

转载自www.cnblogs.com/h404nofound/p/12196882.html