原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270
思路:可知,要使最大代码取得最大值,那么a[i]的每一位都应是取得上限或者下限,也就是1或者b[i],然后分情况dp就好,O(n)
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e4 + 5;
const int MOD = 1e9 + 7;
int dp[MAXN][2], a[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
dp[0][1] = dp[0][0] = 0;
for (int i = 1; i < n; i++) {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + abs(a[i - 1] - 1));
dp[i][1] = max(dp[i - 1][1] + abs(a[i - 1] - a[i]), dp[i - 1][0] + abs(1 - a[i]));
}
printf("%d\n", max(dp[n - 1][0], dp[n - 1][1]));
return 0;
}