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             else
44             {
45                 cout << 0 << endl;
46             }
47         }
48         else
49         {
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:

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

 

posted @ 2014-10-08 09:52  radical  阅读(130)  评论(0编辑  收藏  举报