HDOJ 1003Max Sum (dp)

xiaoxiao2021-02-28  84

This is original link to the problem

this question is a typical dp problem .It’s need us to find the maximum sub region sum,and I tear apart the equation of dp to find the start point and terminate point .

#include<bits/stdc++.h> #include <cstring> #define maxn 100005 int dp[maxn]; int num[maxn]; int st[maxn]; int en[maxn]; using namespace std; int T=0; void islast(int t) { if(t!=T) { printf("\n"); } } int main() { scanf("%d",&T); for(int t=1;t<=T;t++) { memset(dp,0,sizeof(dp)); memset(en,0,sizeof(en)); memset(st,0,sizeof(st)); int n=0; int cnt=0,minus_n = -99999999,minus_index; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&num[i]); if(num[i]<0) { cnt++; if(minus_n < num[i]) { minus_index = i; minus_n = num[i]; } } } if(cnt==n) { printf("Case %d:\n",t); printf("%d %d %d\n",minus_n,minus_index,minus_index); islast(t); continue; } dp[1] = num[1]; en[1] = st[1] = 1; int ans=-1,index; for(int i=2;i<=n;i++) { //dp[i] = max(dp[i-1],0)+num[i]; if(dp[i-1]>=0) { dp[i] = num[i]+dp[i-1]; en[i] = i; st[i] = st[i-1]; } else { dp[i] = num[i]; st[i] = en[i] = i; } if(ans < dp[i]) { ans = dp[i]; index = i; } } /*for(int i=0;i<=n;i++) { cout<<dp[i]<<" "<<st[i]<<" "<<en[i]<<endl; }*/ printf("Case %d:\n",t); printf("%d %d %d\n",ans,st[index],en[index]); islast(t); //cout<<ans<<" "<<st[index]<<" "<<en[index]<<endl; //cout<<dp[n]<<" "<<st[n]<<" "<<en[n]<<endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-57566.html

最新回复(0)