首页 > 代码库 > hdu--4504--又是dp啊<方案决策数>

hdu--4504--又是dp啊<方案决策数>

其实 这题 有点类似 以前做过的一题

hdu的1028 就是给你一个数n 然后让你求出能满足等于它的加法等式

也是个dp[x][y]的状态

这边的话 就是dp[x][y]表示打到第x次进攻的时候 我得到了y分的进攻策略有多少种

然后转移方程 不难dp[i][j] += dp[i-1][j-1]     dp[i][j]+= dp[i-1][j-2]  dp[i][j] += dp[i-1][j-3]

然后就是对于进攻0次 进行下特判就好..

哎 去找班主任请假了 -.-

 1 #include <iostream> 2 using namespace std; 3  4 const int size = 25; 5 typedef long long LL; 6 LL dp[size][size*3];//dp[x][y]到第x次进攻得到y分有几种方法 7 int score_times; 8  9 void solve( )10 {11     for( int i = 1 ; i<=score_times ; i++ )12     {13         for( int j = 1 ; j<=i*3 ; j++ )14         {15             if( j>1 )16                 dp[i][j] += dp[i-1][j-1];17             if( j>2 )18                 dp[i][j] += dp[i-1][j-2];19             if( j>3 )20                 dp[i][j] += dp[i-1][j-3];21         }22     }23 }24 25 int main()26 {27     cin.sync_with_stdio(false);28     LL ans;29     int min_score , a , b , t;30     while( cin >> a >> b >> t )31     {32         memset( dp , 0 , sizeof(dp) );33         dp[1][1] = dp[1][2] = dp[1][3] = 1;34         ans = 0;35         min_score = a - b - 1 - t/30;36         score_times = (t/15+1)/2;37         if( score_times == 0 )38         {39             if( min_score>=0 )40             {41                 cout << 1 << endl;42             }43             else44             {45                 cout << 0 << endl;46             }47         }48         else49         {50             min_score = min_score <=0 ? -min_score : 0;51             solve( );52             for( int i = min_score ; i<=score_times*3 ; i++ )53             {54                 ans += dp[score_times][i];55             }56             cout << ans << endl;57         }58     }59     return 0;60 }61 a
View Code

 

today:

  这个世界上的每个角落无时无刻不上演着离别与告别

 

hdu--4504--又是dp啊<方案决策数>