HDU 2125 Local area network

简单DP,N×M的网格其中有一条边坏掉了,问从起点到终点的放法数

有两种方法,一种是DP很好理解

 

 1 //#define LOCAL
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 int dp[42][42];
 6 bool flag[42][42];
 7 
 8 int main(void)
 9 {
10     #ifdef LOCAL
11         freopen("2125in.txt", "r", stdin);
12     #endif
13 
14     int r, c;
15     while(scanf("%d%d", &r, &c) == 2)
16     {
17         int y1, x1, y2, x2;
18         scanf("%d%d%d%d", &y1, &x1, &y2, &x2);
19         dp[0][1] = 1;
20         memset(flag, false, sizeof(flag));
21         flag[x1+1][y1+1] = flag[x2+1][y2+1] = true;
22         for(int i = 1; i <= r; ++i)
23             for(int j = 1; j <= c; ++j)
24             {
25                 dp[i][j] = dp[i-1][j] + dp[i][j-1];
26                 if(flag[i][j])
27                 {
28                     if(flag[i][j-1])
29                         dp[i][j] -= dp[i][j-1];
30                     if(flag[i-1][j])
31                         dp[i][j] -= dp[i-1][j];
32                 }
33             }
34         printf("%d\n", dp[r][c]);
35     }
36     return 0;
37 }
代码君

 

第二种,用数学公式

如果没有坏边的话,总放法数是CN-1(M+N-2) 

因为每种方法都要走(M+N-2)步,向上走N-1步,向下走M-1步

现在考虑一条坏边,那么就计算经过这条坏边的方案数然后从总数里面减去即可

经过坏边的放法数就是从起点到(x1, y1)的放法数×从(x2, y2)到终点的放法数

 1 #define LOCAL
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 long long c(long long m, long long n)
 8 {
 9     if(m==0 || n==0)
10         return 1;
11     n = min(n, m-n);
12     long long ans = 1;
13     for(int i = 0; i < n; ++i)
14         ans = ans * (m-i) / (1+i);
15     return ans;
16 }
17 
18 int main(void)
19 {
20     #ifdef LOCAL
21         freopen("2125in.txt", "r", stdin);
22     #endif
23 
24     int n, m;
25     while(scanf("%d%d", &n, &m) == 2)
26     {
27         int x1, y1, x2, y2;
28         scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
29         if(x1+y1 > x2+y2)
30         {
31             int t = x1;
32             x1 = x2, x2 = t;
33             t = y1;
34             y1 = y2, y2 = t;
35         }
36         printf("%lld\n", c(m+n-2, m-1) - c(x1+y1, x1) * c(m+n-2-x2-y2, m-1-x2));
37     }
38     return 0;
39 }
代码君

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。