Hdu 1003 Max Sum(简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
解题思路:暴力从第一位开始求和,如果当前结果不如当前位的值,那就更新当前结果为当前位的值,更新左右位置,不然就更新右边位置和加上当前位的值,
每次比较结果和最大值,如果比最大值大就更新最大值即左右区间。
代码如下:
#include <bits/stdc++.h>
#define inf 0x3f3f3f
#define MAXN 100005
int dp[MAXN],num[MAXN];
int main() {
int t;
scanf("%d",&t);
int ans=1;
while(t--){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
int max=dp[0]=num[0],l=0,r=0,s=0,e=0;//最大值,当前结果,结果的开始点和结束点,运算过程中的开始点和结束点.
for(int i=1;i<n;i++){
if(dp[i-1]+num[i]<num[i]){
s=e=i;
dp[i]=num[i];
}else{
e=i;
dp[i]=dp[i-1]+num[i];
}
if(dp[i]>=max){
max=dp[i];
l=s;
r=e;
}
}
if(ans!=1)printf("\n");
printf("Case %d:\n%d %d %d\n",ans++,max,l+1,r+1);
}
return 0;
}