【51Nod - 1270】数组的最大代价(dp,思维)
題干:
數(shù)組A包含N個(gè)元素A1, A2......AN。數(shù)組B包含N個(gè)元素B1, B2......BN。并且數(shù)組A中的每一個(gè)元素Ai,都滿足1 <= Ai <= Bi。數(shù)組A的代價(jià)定義如下:
?
?
(公式表示所有兩個(gè)相鄰元素的差的絕對(duì)值之和)
給出數(shù)組B,計(jì)算可能的最大代價(jià)S。
Input
第1行:1個(gè)數(shù)N,表示數(shù)組的長(zhǎng)度(1 <= N <= 50000)。 第2 - N+1行:每行1個(gè)數(shù),對(duì)應(yīng)數(shù)組元素Bi(1 <= Bi <= 10000)。
Output
輸出最大代價(jià)S。
Sample Input
5 10 1 10 1 10Sample Output
36解題報(bào)告:
? 如果直接按照題意定義dp[i][j]代表截止到第i個(gè)數(shù),且第i-1個(gè)數(shù)選的是j,的最大代價(jià)。這樣轉(zhuǎn)移的話顯然就炸了。我們通過(guò)分析問(wèn)題不難發(fā)現(xiàn),因?yàn)榇鷥r(jià)函數(shù)是絕對(duì)值的形式,那么要想讓這個(gè)代價(jià)最大,很顯然要么取最小值,要么取b[i],所以直接dp[n][2]其實(shí)就可以解決這個(gè)問(wèn)題了。這樣就大大縮小了狀態(tài)個(gè)數(shù),也方便了求解。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define FF first #define SS second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e5 + 5; int n,a[MAX]; ll dp[MAX][2]; int main() {cin >> n;for(int i = 1; i<=n; i++) {scanf("%d",a+i);if(i == 1) continue;dp[i][0] = max(dp[i-1][0],dp[i-1][1] + abs(a[i-1]-1));dp[i][1] = max(dp[i-1][0] + abs(a[i]-1),dp[i-1][1] + abs(a[i]-a[i-1]));}cout << max(dp[n][0],dp[n][1]) << endl;return 0 ; }?
總結(jié)
以上是生活随笔為你收集整理的【51Nod - 1270】数组的最大代价(dp,思维)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 颠覆认知!美国科研团队发现2厘米长巨大细
- 下一篇: java 抽象类构造函数_抽象类可以有构