1. 程式人生 > >HDOJ 1003 Max Sum(動態規劃)

HDOJ 1003 Max Sum(動態規劃)

題目連結

題目分析:

用dp[i]表示第i個數結尾的最大和 dp[i+1]=max(dp[i]+ar[i+1],ar[i+1]); 即以第i+1個數結尾的最大和為max{第i個數結尾的最大和+第i+1個數的值,第i+1個數的值} 要求子串的最大值,還需用一個變數儲存,並在更新答案時將串的結尾索引記錄下來 完成之後,再從結尾向前累加直到與求到的最大值相等找到開頭的索引。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int T;
int N;
int ar[
100010]; int dp[100010]; int Start; int End; int maxi; void solve() { Start=0; End=0; maxi=-0x3f3f3f3f; memset(dp,0,sizeof(dp)); for(int i=0;i<N;i++) { dp[i+1]=max(dp[i]+ar[i+1],ar[i+1]); if(maxi<dp[i+1]) //求到最大值 { maxi=dp[i+1]; End=
i+1; } } int sum=0; for(int i=End;i>=1;i--) { sum+=ar[i]; if(sum==maxi) Start=i; } } int main() { scanf("%d",&T); for(int kase=1;kase<=T;kase++) { scanf("%d",&N); for(int i=1;i<=N;i++) scanf
("%d",&ar[i]); solve(); printf("Case %d:\n",kase); printf("%d %d %d\n",maxi,Start,End); if(kase!=T) printf("\n"); } return 0; }