只要上一个子序列最大和为正,那么无论当前值的正负,都会与当前的相加,这样以当前值结尾的子序列最大和就会增大。(一个正数 加一个 正数2 或者负数 那么都会比这个正数2 或 负数 原来要增大(此时就是站在新加的这个数的角度看子序列的和,一定会增大),同理,一个负数加任何一个数,都会使这个数减小,因此当前一子序列最大和小于零时,我们就归零它了,相当于是不加任何数,而保留当前位置值本身)
上面这段话来自http://alorry.blog.163.com/blog/static/6472570820123801223397/,感觉不错就引用过来了
代码中的sum其实就是S(i),每一次循环的sum都代表一个S(i)
#include <iostream> using namespace std; int a[100005]; int main() { int t,n,ans,sum; cin>>t; while(t--) { cin>>n; ans=-1000000; sum=-1000000; for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n; i++) { if(sum<0) sum=a[i]; else sum+=a[i]; if(ans<sum) ans=sum; } cout<<ans<<endl; } return 0; }
求最大子序列的和( 动态规划dp)
猜你喜欢
转载自blog.csdn.net/qq_40733911/article/details/81208623
今日推荐
周排行