P2426 刪數(C++)---動態規劃

題目描述

有N個不同的正整數數x1, x2, ... xN 排成一排,我們可以從左邊或右邊去掉連續的i(1≤i≤n)個數(只能從兩邊刪除數),剩下N-i個數,再把剩下的數按以上操作處理,直到所有的數都被刪除爲止。

每次操作都有一個操作價值,比如現在要刪除從i位置到k位置上的所有的數。操作價值爲|xi – xk|*(k-i+1),如果只去掉一個數,操作價值爲這個數的值。 問如何操作可以得到最大值,求操作的最大價值。

輸入格式

第一行爲一個正整數N;

第二行有N個用空格隔開的N個不同的正整數。

輸出格式

一行,包含一個正整數,爲操作的最大值

輸入輸出樣例

輸入 #1複製

6
54 29 196 21 133 118

輸出 #1複製

768

說明/提示

【樣例說明】

說明,經過3 次操作可以得到最大值,第一次去掉前面3個數54、29、196,操作價值爲426。第二次操作是在剩下的三個數(21 133 118)中去掉最後一個數118,操作價值爲118。第三次操作去掉剩下的2個數21和133 ,操作價值爲224。操作總價值爲426+118+224=768。

【數據規模】

3≤N≤100,N個操作數爲1..1000 之間的整數。
 

——題目來源:洛谷

 



解題代碼如下

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
	int n;
	cin>>n;
	int a[n];
	for(int i = 0; i < n; i++)
	{
		cin>>a[i];
	}
	int dp[n]; //dp數組記錄:當從左往右刪的時候,去掉前面n個數(用下標表示)時的最大價值 
	dp[0] = a[0];
	
	for(int i = 1; i < n; i++)
	{
		for(int j = 0; j < i; j++)
		{
			if (j == 0) {
				dp[i] = max(dp[i-1] + a[i], abs(a[i] - a[j]) * (i - j + 1));
			} else {
				dp[i] = max(dp[i], abs(a[i] - a[j]) * (i - j + 1) + dp[j-1]);
			}
			
		}
	}
	
	cout<<dp[n-1];
	
	return 0;
}

結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章