序列型的动态规划找状态一般考虑起始开始的点。例如这题状态是以i结尾的序列的最长子序列和dp[i]。
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int dp[100001];
int num[100001];
int first[100001];
int main()
{
int m;
while (cin >> m)
{
for (int k = 1; k <= m; k++)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> num[i];
dp[1] = num[1];
int max = num[1];
int maxnum = 1;
first[1] = 1;
for (int i = 1; i <= n; i++)
{
if (dp[i] + num[i + 1] >= num[i + 1])
{
dp[i + 1] = dp[i] + num[i + 1];
first[i + 1] = first[i];
}
else
{
dp[i + 1] = num[i + 1];
first[i + 1] = i + 1;
}
if (dp[i] > max)
{
max = dp[i];
maxnum = i;
}
}
cout << "Case " << k << ":" << endl << max << " " << first[maxnum] << " " << maxnum << endl;
if (k != m) cout << endl;
}
}
}
一开始数组开小了一直超时。。。。。