hdoj1003注意在寻找最优解对应的时候寻找的顺序

来源:互联网 发布:方维o2o上门服务 源码 编辑:程序博客网 时间:2024/06/03 07:38
//提取信息起始位置,终止位置,最大和//发现数组较大可以将保存信息改造只存储终止位置//那么dp[i] = max(a[i],dp[i-1]+a[i])//主意要用dp[i-1]<0判断如果小于0那么肯定不用算了这题最先算的是从前到后的//否则直接比较大小的话dp[i]就会出现I,i在前面而不是1-i在前面//46MS 2792K #include <iostream>#include <algorithm>using namespace std;#define  MAX_N 100005static int dp[MAX_N];static int top[MAX_N];//保存初始位置static int a[MAX_N];static int n;static void DP(){for (int i=0;i<n;++i) dp[i] = -9999;memset(top,0,sizeof(top));dp[0] = a[0];top[0] = 0;int startpos = 0;int endpos = 0;int ans = a[0];//主意是从-1000开始算的for (int i=1;i<n;++i){if (dp[i-1]<0){dp[i] = a[i];top[i] = i;}else{dp[i] = dp[i-1]+a[i];top[i] = top[i-1];}if (ans<dp[i]){ans = dp[i];startpos = top[i];endpos = i;}}printf("%d %d %d\n",ans,startpos+1,endpos+1);}int main(){int T;scanf("%d",&T);for (int t=1;t<=T;++t){scanf("%d",&n);for (int i=0;i<n;++i) scanf("%d",&a[i]);printf("Case %d:\n",t);DP();if (t==T) break;else printf("\n");}return 0;}

0 0
原创粉丝点击