其实 这题 有点类似 以前做过的一题
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
today:
这个世界上的每个角落无时无刻不上演着离别与告别
时间: 2024-10-21 05:08:31