我的:
Dynamic Programming :
转移方程式为:
dp[i]=dp[i-1]+a[i]>a[i]?dp[i-1]+a[i]:a[i]
//保证每次Dynamic Programming都是连续的
代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<deque>
#include<list>
#include<cmath>
using namespace std;
const int maxn=100000+10;
int main()
{
int t;
cin>>t;
int s=0;
while(t--)
{
s++;
int n;
cin>>n;
int a[maxn];
int dp[maxn];
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
dp[i]=max(dp[i-1]+a[i],a[i]);//保证每次dynamic programming 都是连续的
}
int ans=0;
for(int i=0;i<n;i++)
{
if(dp[i]>dp[ans])
ans=i;
}
int sum=dp[ans];
int k=0;
for(int i=ans;i>=0;i--)
{
sum-=a[i];
if(sum==0)
{
k=i;
// break;
}
}
cout<<"Case "<<s<<":"<<endl;
cout<<dp[ans]<<" "<<k+1<<" "<<ans+1<<endl;
if(t)
cout<<endl;
}
return 0;
}