Sum遊戲 Uva10891 區間dp

2021-09-17 07:24:15 字數 1007 閱讀 1488

給定乙個序列,a,b玩家輪流取數,每次只能從一段取若干個數,乙個人取數的和代表該人的得分,若a,b都採取最優策略,問a的得分-b的得分

對於都是正數的情況,肯定一次取完就可以。

但是由於有負數,所以我們就要考慮列舉取法

已知取完後的序列一定是原序列的乙個子串行,因此,我們列舉取法

dp[i][j] 表示剩下 i,j 這個區間的序列的數時,先手能夠取得的最大結果

dp[i][j] 應該 sum

(i,j

)−mi

n(0,

dp[i

][k]

(i≤k

,dp[

t][j

](i+

1≤t≤

j)

)sum(i,j)-min(0, dp[i][k] (i \le ksu

m(i,

j)−m

in(0

,dp[

i][k

](i≤

k,dp[

t][j

](i+

1≤t≤

j))sum(i,j) 表示 i,j的區間和

更新的時候採用區間dp的方式更新就可以了

#include using namespace std;

typedef long long ll;

const int maxn=1e3+50;

const int mod=1e9+7;

ll a[maxn];

int n;

ll sum[maxn];

ll dp[maxn][maxn];

ll getsum(int x,int y)

int main()

ll f[maxn][maxn],g[maxn][maxn];

int main()

}printf("%lld\n",dp[1][n]*2-sum[n]);

}return 0;

}

Uva 10891 經典博弈區間DP

經典博弈區間dp 題意 給定n個數字,a和b可以從這串數字的兩端任意選數字,一次只能從一端選取。並且a b都盡力使自己選擇的結果為最大的,可以理解成a b每一步走的都是最優的。如果a先選擇,則a b差值最大是多少。分析 總和是一定的,所以乙個得分越高,另乙個人的得分越低。當前狀態總是最開始的狀態的乙...

UVA 10382 (區間貪心)

注意每個圓管轄的區間不是最左或最右的端點而是和被覆蓋圖形的交點。直接按照每個圓的left排序 每次盡量尋找靠右的就可以了。include include include include include include include include include include include i...

合併遊戲 737 區間Dp

石子合併 一 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。輸入 有多組測試資...