pku 1243 One Person 想法很牛的一道DP
想了半天,沒想出來,么辦法,直接百度,先原樣引用我參考的一篇文章【題目大意】猜數字的游戲,可以猜N次,且只能猜大L次,求在一定的策略下,能猜到的最大的數。
----------------------------------------------------------
【分析】:很詭異的動態規劃,看別人的分析:
1.先考慮L=0的情況,由于一次都不能猜錯,因此只能從1開始,逐個向上猜,總數不能超過G;
2.若G<=L,等價于G=L的情況,因為此時允許猜的次數限制了最大的數,總數為2^G
3.一般的情況,比如L=1時,可以設想,只能猜錯一次的話,這個數不能太大,否則猜錯了一點作用也沒有,因此要確保即使本次猜錯也能在以后的G-1次猜中,這就轉化成了(G-1,0)的情況,也就是說必勝的策略應當為先猜G,如果錯,則從1~G-1逐次的猜,如果猜對了就轉化成了(G-1,1)的情況,他應當再猜G+G-1……對于G=i,L=j的情況也是一樣的考慮,可以列出狀態轉移方程:
opt[i][0]= i;
opt[i][i]= 2^i-1;
opt[i][j]= opt[i-1][j]+ opt[i-1][j-1]+ 1;
Source Code
Problem: 1243 | User: Sasuke_SCUT | |
Memory: 380K | Time: 0MS | |
Language: G++ | Result: Accepted |
- Source Code
#include<cstdio> #include<string.h> #include<math.h> int main() { int G,L,i,j,T,dp[31][31]; T=1; while(scanf("%d %d",&G,&L) && G) { memset(dp,0,sizeof dp); dp[0][0]=1; for(i=1;i<=G;i++) { dp[i][0]=i; for(j=1;j<=L;j++) if(j>=i) dp[i][j]=pow(2.0,i)-1; else dp[i][j]=dp[i-1][j]+1+dp[i-1][j-1]; } printf("Case %d: %d\n",T++,dp[G][L]); } return 0; }
posted on 2011-01-20 01:36 yzhw 閱讀(218) 評論(0) 編輯 收藏 引用 所屬分類: DP