Total Submission(s) : 210 Accepted Submission(s) : 40
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Case 1: 14 1 4 Case 2: 7 1 6
题目大意:求个子数列让这个数列的和最大;
这个数列是连续的,并且要把子列的位置记录下来;
思路:
因为他要有起始位置和结束位置所以我就从这里入手定义了一个二维数组来存起始位置和和
最后比较去最大的和输出和其实位置和结束位置
代码:
#include<iostream>
#include<string.h>
using namespace std;
int iarr[100001];
int dp[100001][2];
int n;
int ans = -100000000,i,p;
void dps()
{
ans = -100000000;
dp[0][0] = iarr[0];
dp[0][1] = 0;
for (i = 1; i < n; i++)
{
if (dp[i - 1][0] + iarr[i] >= iarr[i])
{
dp[i][0] = dp[i - 1][0] + iarr[i];
dp[i][1] = dp[i - 1][1];
}
else
{
dp[i][0] = iarr[i];
dp[i][1] = i;
}}
for (i = 0; i < n; i++)
if (dp[i][0] > ans)
{
ans = dp[i][0];
p = i;
}
}
int main()
{
int t;
cin>>t;
for(int s=1;s<=t;s++)
{
memset(iarr,0,sizeof(iarr));
memset(dp,0,sizeof(dp));
cin>>n;
for(int j=0;j<n;j++)
cin>>iarr[j];
dps();
cout << "Case " <<s<< ":" <<endl;
if (s != t)
cout << ans << " " << (dp[p][1] + 1) << " " << (p + 1) << endl <<endl;
else
cout << ans << " " << (dp[p][1] + 1) << " " << (p + 1) << endl;
}
return 0;
}