四行的dp WA了,两行的AC了。
待解决......
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 4010;
int dp[2][maxn][2];
int u[maxn];
int n, b;
int main()
{
cin >> n >> b;
for(int i = 1; i <= n; i++)
cin >> u[i];
memset(dp, -INF, sizeof(dp));
dp[0][0][0] = dp[1][0][0] = dp[1][1][1] = 0;
int k;
for(int i = 2; i <= n; i++)
{
k = i & 1;
for(int j = 1; j <= i; j++)
{
dp[k][j][0] = max(dp[k^1][j][0], dp[k^1][j][1]);
dp[k][j][1] = max(dp[k^1][j - 1][0], dp[k^1][j - 1][1] + u[i]);
/*
dp[k][j][0] = max(dp[k^1][j][0], dp[k][j][0]);
dp[k][j][0] = max(dp[k^1][j][1], dp[k][j][0]);
dp[k][j][1] = max(dp[k^1][j - 1][0], dp[k][j][1]);
dp[k][j][1] = max(dp[k^1][j - 1][1
*/
}
}
int ans = max(dp[n&1][b][0], dp[n&1][b][1]);
memset(dp, -INF, sizeof(dp));
dp[0][0][0] = dp[1][0][0] = 0;
dp[1][1][1] = u[1];
for(int i = 2; i <= n; i++)
{
k = i & 1;
for(int j = 1; j <= i; j++)
{
dp[k][j][0] = max(dp[k^1][j][0], dp[k^1][j][1]);
dp[k][j][1] = max(dp[k^1][j - 1][0], dp[k^1][j - 1][1] + u[i]);
/*
dp[k][j][0] = max(dp[k^1][j][0], dp[k][j][0]);
dp[k][j][0] = max(dp[k^1][j][1], dp[k][j][0]);
dp[k][j][1] = max(dp[k^1][j - 1][0], dp[k][j][1]);
dp[k][j][1] = max(dp[k^1][j - 1][1] + u[i], dp[k][j][1]);
*/
}
}
ans = max(ans, dp[n&1][b][1]);
cout << ans << endl;
return 0;
}