牛客小白月赛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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}

浙公网安备 33010602011771号