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