Advertisement
Guest User

Untitled

a guest
May 26th, 2015
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #define ll long long
  5. #define mp make_pair
  6. using namespace std;
  7. ll N,H,M;
  8. ll dp[11][2501][61][71];
  9. ll sum[71][71]={0};
  10. /* ll solve(ll ini,ll h,ll top){
  11.  
  12. //each step there are two options --> top +- 1
  13. if (h>H || top<=0 || ini>N)
  14. return (dp[ini][h][top]=0);
  15. else if (h<=H && top>0 && ini<=N)
  16. return (dp[ini][h][top] = 1);
  17. else
  18.  
  19. } */
  20. void solve1(){
  21.  
  22. for (int i1=1;i1<=10;i1++)
  23. for (int i=0;i<2500;i++)
  24. for (int j=0;j<61;j++)
  25. for (int k=0;k<71;k++)
  26. dp[i1][i][j][k] = 0LL;
  27.  
  28. //dp[i][j][k]--> total of i blocks of height j and top block being k
  29. //can keep track of number of blocks using outside variable
  30.  
  31.  
  32.  
  33. ll lim = 2500;
  34.  
  35. for (int i1=1;i1<=10;i1++){
  36. dp[i1][i1][1][i1] = 1;
  37. for (int i=1; i <= lim ; i++){
  38. for (int j=2; j <= 60 ; j++){
  39. for (int k = 1 ; k < 71 ; k++){
  40.  
  41. if ( (i >= k) && (k+1<70) )
  42. dp[i1][i][j][k] += dp[i1][i-k][j-1][k+1];
  43. if ( (i >= k) && (k-1>=0) )
  44. dp[i1][i][j][k] += dp[i1][i-k][j-1][k-1];
  45.  
  46. //cout<<i<<" "<<j<<" "<<k<<" "<<dp[i][j][k]<<"\n";
  47.  
  48. }
  49. }
  50. }
  51. }
  52.  
  53. //dp[m][h]
  54. for (int i = 1; i <= 10 ; i++){
  55. for (int j=1 ; j <= 60 ; j++){
  56.  
  57. for (int i1=1; i1 <= 2500 ; i1++)
  58. for (int j1= 1 ; j1<71 ; j1++)
  59. sum[i][j] += dp[i][i1][j][i];
  60.  
  61.  
  62. }
  63. }
  64.  
  65. }
  66. int main(){
  67. //make a tower out of n cubes such that height is h and bottom has m cubes
  68. //thoughts- dp, think of a recurrence
  69. ll t;
  70. scanf("%lld",&t);
  71. solve1();
  72. while(t--){
  73. scanf("%lld %lld %lld",&N,&H,&M);
  74. ll ans;
  75. ans = sum[M][H];
  76. /* ll lim = min(N,(ll)2500);
  77. for (int i= M ; i <= lim ; i++)
  78. for (int j = 1; j < 71 ; j++)
  79. ans = ans + dp[M][i][H][j]; */
  80.  
  81. printf("%lld\n",ans);
  82. }
  83. return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement