标签:
求最长总和序列,状态转移方程:dp[i] = max(dp[i-1]+a[i].a[i])
因为可能有负数,所以要判断dp是否大于0,如果小于0则序列中断,从中断点开始
起始点可以用数组s保存,有中断点就保存,没有的话s[i]=s[i-1]
另外还有输出最后换行的问题,有时中间要换行但最后不需要换行,如果没注意可能会出现PE
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define debug printf("!\n") #define INF 10000 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long int n; int dp[100010]; int a[100010]; int s[100010]; int main() { int i,j,t,k; sf("%d",&t); for(k = 1;k<=t;) { sf("%d",&n); mem(dp,0); mem(a,0); for(i = 0;i<n;i++) { sf("%d",&a[i]); } dp[0]=a[0]; int e=1; for(i = 1;i<n;i++) { if(dp[i-1]>=0) { dp[i] = max(dp[i-1]+a[i],a[i]); s[i] = s[i-1]; } else { dp[i] = a[i]; s[i] = i; } } int max = -1000; for(i=0;i<n;i++) { if(max<dp[i]) { max = dp[i]; e=i; } } pf("Case %d:\n",k); pf("%d %d %d\n",max,s[e]+1,e+1); k++; if(k<=t) blank; } }
标签:
原文地址:http://www.cnblogs.com/qlky/p/5155203.html