日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uva10891Game of sum

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uva10891Game of sum 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:經典的取石子游戲是這樣的:有一堆石子,A、B兩個人輪流取,每次取一顆,只能從邊上取,每個石子有相應的價值,A、B兩人都想使得自己的價值最多,兩個人足夠聰明,問最后價值分別是多少

本題則是可以取多顆,但仍然只能從一側取得

分析:狀態轉移方程

best[i][j]=sum[i][j]-min(best[i][j-k],best[i+k][j], 0);{1<=k=j-i+1}.

使用了記憶化的方法,O(n3),書上說有進一步的優化,不過當前數據下已經很快了(64ms)

代碼:

View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 using namespace std; 5 const int MAXN = 100 + 10; 6 #define DEBUG 7 int min(int a, int b){ 8 return a<b?a:b; 9 } 10 int s[MAXN], a[MAXN], d[MAXN][MAXN], vis[MAXN][MAXN], n; 11 int dp(int i, int j){ 12 if(vis[i][j]) return d[i][j]; 13 vis[i][j]=1; 14 int m=0, k; 15 for(k=i+1; k<=j; k++) m=min(m, dp(k, j)); 16 for(k=i; k<j; k++) m=min(m, dp(i, k)); 17 d[i][j]=s[j]-s[i-1]-m;; 18 return d[i][j]; 19 } 20 int main(){ 21 #ifndef DEBUG 22 freopen("in.txt", "r", stdin); 23 #endif 24 while(scanf("%d", &n)!=EOF && n){ 25 s[0]=0; 26 int i; 27 for(i=1; i<=n; i++){ 28 scanf("%d", &a[i]); 29 s[i] = s[i-1] + a[i]; 30 } 31 memset(vis, 0, sizeof(vis)); 32 printf("%d\n", 2*dp(1,n)-s[n]); 33 } 34 return 0; 35 }

?

?

轉載于:https://www.cnblogs.com/zjutzz/archive/2013/02/14/2911230.html

總結

以上是生活随笔為你收集整理的uva10891Game of sum的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。