第一眼看下去感覺就是博弈,
沒想到正解竟然是dp。
下次見到博弈的題目也應該要往dp方面想一想。
我們知道影響答案的因素只有兩個:當前取到第幾個硬幣、上一次取了多少。
我們設fi,
j 表示取到第i位,上一次取了j個,先手的最優答案。
轉移:考慮這一次要取多少個,列舉乙個k(
1≤k≤
2∗j)
先手肯定可以得到i~i+k-1這一區間的硬幣。
在他取了這k個以後,就變為了對手為先手,取到第i+k位,上一次取了k。
對手也是用最優策略,所以他可以得到的硬幣值為fi
+k,k
也就是說,留給我們的硬幣值就為這一段區間的和減去fi
+k,k
但是,狀態是n2
,轉移是n的,總的複雜度是n3
不過我們發現,在每次列舉k的時候只有最後兩個是有意義的,
所以轉移可以優化到o(1),總的複雜度就是o(
n2) 了
將硬幣值倒過來做會方便一些。
#include
#include
#include
#include
#include
#include
#define n 2003
using namespace std;
int n,a[n],f[n][n],sum[n];
char ch;
void read(int &n)
int main()
printf("%d",f[n][1]);
}
1381硬幣遊戲
基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況...
1381 硬幣遊戲
1381 硬幣遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些...
硬幣遊戲 期望
有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...