51nod1270(dp)
生活随笔
收集整理的這篇文章主要介紹了
51nod1270(dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270
?
題意:中文題誒~
?
思路:dp
s=abs(a1-a0)+abs(a2-a1)....
要使s盡量大,需要讓abs(ai-ai-1)盡量大,那么可以讓其中一個盡量小,一個盡量大。1<=ai<=bi,所以可以令其中一個為1,一個為bi/bi-1(通過樣列大概也能看出那么一點點來)。
那么接下來就是一個簡單的dp過程吶.....
用dp[i][0]存儲當到第 i 個元素為止前元素選1的最大s,dp[i][1]存儲當前選b[i]的最大s,那么狀態轉移方程為:
? dp[i][0]=max(dp[i-1][0], dp[i-1][1]+abs(a[i-1]-1));//當前元素選1
?? ??? ? dp[i][1]=max(dp[i-1][0]+abs(a[i]-1), dp[i-1][1]+abs(a[i]-a[i-1]));//當前元素選a[i]
?
代碼:
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 using namespace std; 5 6 const int MAXN=5e4+10; 7 int a[MAXN], dp[MAXN][2];//dp[i][0]存儲當前元素選1的最大s,dp[i][1]存儲當前選b[i]的最大s 8 9 int main(void){ 10 int n; 11 scanf("%d", &n); 12 for(int i=0; i<n; i++){ 13 scanf("%d", &a[i]); 14 } 15 for(int i=1; i<n; i++){ 16 dp[i][0]=max(dp[i-1][0], dp[i-1][1]+abs(a[i-1]-1));//當前元素選1 17 dp[i][1]=max(dp[i-1][0]+abs(a[i]-1), dp[i-1][1]+abs(a[i]-a[i-1]));//當前元素選a[i] 18 } 19 cout << max(dp[n-1][0], dp[n-1][1]) << endl; 20 return 0; 21 } View Code?
轉載于:https://www.cnblogs.com/geloutingyu/p/6686160.html
總結
以上是生活随笔為你收集整理的51nod1270(dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集合框架05
- 下一篇: 代码整洁之道,clean code