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 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4683345.html