先用记忆化搜索写的,搜错了。。看了下讨论版,写成了如下的形式。
每个Ai取1或者Bi,然后dp。。。。dp[i][0]表示前i个数字且第i个数字取1的最大代价,dp[i][1]表示前i个数字且第i个数字取Bi的最大代价。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 50010;
int num[MAXN];
int dp[MAXN][2];
int n;
int main()
{
//freopen("in","r",stdin);
ios::sync_with_stdio(false);
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> num[i];
for(int i = 2; i <= n; ++i)
{
dp[i][0] = max(dp[i-1][0],dp[i-1][1] + abs(1-num[i-1]));
dp[i][1] = max(dp[i-1][0] + abs(num[i]-1),dp[i-1][1] + abs(num[i]-num[i-1]));
}
cout << max(dp[n][0],dp[n][1]) << endl;
return 0;
}