题意:给出一串数,求最大和的字串和起始终点位置。
与导弹问题大同小异,有状态转移方程就很好做了。
状态转移方程:d[i]=(d[i-1]+a[i]>a[i])?d[i-1]+a[i]:a[i];
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int maxn=100000+10; 6 7 int dp[maxn],num[maxn]; 8 9 int main(){ 10 int t,n,flag=1; 11 cin>>t; 12 while(t--){ 13 cin>>n; 14 for(int i=1;i<=n;i++) 15 cin>>num[i]; 16 dp[1]=num[1]; 17 for(int i=2;i<=n;i++){ 18 if(dp[i-1]<0) dp[i]=num[i];//之前的数之和已经小于0了,所以直接从新赋值 19 else dp[i]=dp[i-1]+num[i];//不然就继续加数 20 } 21 int max=dp[1],end=1; 22 for(int i=2;i<=n;i++){ 23 if(dp[i]>max){ 24 max=dp[i]; 25 end=i; 26 } 27 } 28 int start=end; 29 int sum=0; 30 for(int i=end;i>=1;i--){ 31 sum=sum+num[i]; 32 if(sum==max) start=i; 33 } 34 printf("Case %d:\n",flag++); 35 printf("%d %d %d\n",max,start,end); 36 if(t) printf("\n"); 37 } 38 return 0; 39 }
时间: 2024-10-13 00:01:21