題意:給出n個數字,a和b兩個人依次選中1−
k(k≥
2),把他們合併之後自己分數加上這些數的和。求兩個人在最右策略下a最多領先b多少。當數字只剩下乙個之後遊戲馬上結束。 用
dp[i
][0/
1]表示前i個數字被合併,現在是a/b先手到最後遊戲結束最多領先多少。故a要最大化後繼狀態的值,b要最小化後繼狀態的值,轉移就很顯然了:dp
[i][
0]=m
axdp[
i][1
]=mi
n
其中sum陣列是a陣列的字首和。因為每次都用乙個最大/小值去更新,所以用兩個單調佇列維護dp
[i][
1]+s
um[i
] 和dp
[i][
0]+s
um[i
] 即可。
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 200005
long
long dp[maxn][2], a[maxn], sum[maxn];
int n;
priority_queue long> q1;
struct node
};priority_queue q2;
int main ()
dp[n][0] = dp[n][1] = 0;
while (!q1.empty ()) q1.pop (); while (!q2.empty ()) q2.pop ();
q1.push (dp[n][1]+sum[n]);
q2.push ((node) );
for (int i = n-1; i >= 1; i--) );
}cout
<< dp[1][0] << endl;
return
0;}
codeforces 731C 並查集 水
題意 給出n只襪子的顏色,每天選擇兩隻襪子,每次能把乙隻襪子染色。問最少染色幾隻襪子能使的每天的襪子顏色一樣。給每天穿的兩隻襪子連邊,很顯然乙個分量的襪子要一起考慮,並查集維護分量就好了。然後搜出最多的顏色,把分量的點都染成這個顏色即可。include include include include...
動態規劃(Funny Game,cf 731E)
參考 blog.csdn.net sdfzyhx article details 52832832 第一步是要確定狀態,dp i 表示前i個縮成一堆的情況下先手的最大值。dp i 表示前i個縮成一堆很好想,關鍵是表示什麼的值。題目要求求先手的最大值,因此表示此值十分合理。然後是狀態轉移,自己做的時候...
Codeforces 976E 題解報告
1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...