牛客小白月赛53(线性dp)

 

 

 

分析题目我们可以得到如下转移方程

dp[i][1]表示第i个数选择了a[i]

dp[i][0]表示第i个数选择了1

 

那么对于每一次求相邻之间的绝对值差可以这样转移

dp[i][1] = max(dp[i - 1][1] + abs(a[i] - a[i - 1]),dp[i - 1][0] + a[i] - 1)
dp[i][0] = max(dp[i - 1][1] + a[i - 1] - 1,dp[i - 1][0])

 

那么最后的答案就是max(dp[n][0],dp[n][1]);

 

代码实现:

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int N = 1e5 + 10;
 4 int dp[N][2],a[N];
 5 int main()
 6 {
 7     int n;
 8     scanf("%d",&n);
 9     for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
10     dp[2][0] = a[1] - 1;
11     dp[2][1] = a[2] - 1;
12     for(int i = 3;i <= n;i++) {
13         dp[i][1] = max(dp[i - 1][1] + abs(a[i] - a[i - 1]),dp[i - 1][0] + a[i] - 1);
14         dp[i][0] = max(dp[i - 1][1] + a[i - 1] - 1,dp[i - 1][0]);
15     }
16     printf("%d",max(dp[n][0],dp[n][1]));
17     return 0;
18 }

 

posted @ 2022-07-08 21:32  scannerkk  阅读(28)  评论(0)    收藏  举报