zoukankan      html  css  js  c++  java
  • hdu 4832 dp ***

    dp1[i][j]表示只走x轴走j步到i位置有多少总走法,dp2同,dp方程就很好写

    wa了无数发,发现MOD写在INF上了

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<map>
     8 using namespace std;
     9 #define MOD 9999991
    10 const int INF=9999991;
    11 const double eps=1e-5;
    12 typedef long long ll;
    13 #define cl(a) memset(a,0,sizeof(a))
    14 #define ts printf("*****
    ");
    15 const int MAXN=2050;
    16 int n,m,tt;
    17 int x,y,k;
    18 int c[1050][1050];
    19 int sum1[1050],sum2[1050];
    20 int dp1[MAXN][1050],dp2[MAXN][1050];
    21 void add(int &a,int b)
    22 {
    23     a=(a+b)%MOD;
    24 }
    25 void fun()
    26 {
    27     cl(dp1),cl(dp2);
    28     c[0][0]=c[1][0]=c[1][1]=1;
    29     for(int i=2;i<=1010;i++)
    30     {
    31         c[i][0]=1;
    32         for(int j=1;j<i;j++)
    33         {
    34             c[i][j]=c[i-1][j]+c[i-1][j-1];
    35             c[i][j]%=MOD;
    36         }
    37         c[i][i]=1;
    38     }
    39     dp1[x][0]=1;
    40     for(int i=1;i<=k;i++)
    41     {
    42         for(int j=1;j<=n;j++)
    43         {
    44             if(j+1<=n)  add(dp1[j][i],dp1[j+1][i-1]);
    45             if(j+2<=n)  add(dp1[j][i],dp1[j+2][i-1]);
    46             if(j-1>=1)  add(dp1[j][i],dp1[j-1][i-1]);
    47             if(j-2>=1)  add(dp1[j][i],dp1[j-2][i-1]);
    48         }
    49     }
    50     dp2[y][0]=1;
    51     for(int i=1;i<=k;i++)
    52     {
    53         for(int j=1;j<=m;j++)
    54         {
    55             if(j+1<=m)  add(dp2[j][i],dp2[j+1][i-1]);
    56             if(j+2<=m)  add(dp2[j][i],dp2[j+2][i-1]);
    57             if(j-1>=1)  add(dp2[j][i],dp2[j-1][i-1]);
    58             if(j-2>=1)  add(dp2[j][i],dp2[j-2][i-1]);
    59         }
    60     }
    61     cl(sum1),cl(sum2);
    62     for(int i=0;i<=k;i++)
    63     {
    64         for(int j=1;j<=n;j++)
    65         {
    66             add(sum1[i],dp1[j][i]);
    67         }
    68     }
    69     for(int i=0;i<=k;i++)
    70     {
    71         for(int j=1;j<=m;j++)
    72         {
    73             add(sum2[i],dp2[j][i]);
    74         }
    75     }
    76 }
    77 int main()
    78 {
    79     int i,j;
    80     #ifndef ONLINE_JUDGE
    81     freopen("1.in","r",stdin);
    82     #endif
    83     int ca=1;
    84     scanf("%d",&tt);
    85     while(tt--)
    86     {
    87         scanf("%d%d%d%d%d",&n,&m,&k,&x,&y);
    88         fun();
    89         printf("Case #%d:
    ",ca++);
    90         ll sum=0;
    91         for(i=0;i<=k;i++)
    92         {
    93             sum += (long long)c[k][i]*sum1[i]%MOD*sum2[k-i]%MOD;
    94             sum %= MOD;
    95         }
    96         printf("%d
    ",(int)sum);
    97     }
    98 }
  • 相关阅读:
    APP开发的模式
    微信小程序的传值方式
    面试题总结
    github上传文件的步骤
    python使用笔记15--操作Excel
    python使用笔记14--商品管理小练习
    python使用笔记13--清理日志小练习
    python使用笔记12--操作mysql数据库
    python使用笔记11--时间模块
    python使用笔记10--os,sy模块
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4683345.html
Copyright © 2011-2022 走看看