首页 > 代码库 > 【解题报告】[动态规划]-PID69 / 过河卒

【解题报告】[动态规划]-PID69 / 过河卒

原题地址:http://www.rqnoj.cn/problem/69

解题思路:

  用DP[i][j]表示到达(i,j)点的路径数,则

DP[0][0]=1

DP[i][j]=DP[i-1][j]+DP[i][j-1](不是马的控制点和马的当前位置)

DP[i][j]=0(马的位置和马的控制点)

 

代码:

 1 #include<stdio.h>
 2 #include<iostream>
 3 #define abs(x) (((x)>0)?(x):(-(x)))
 4 using namespace std;
 5 long long dp[35][35]={1,0};
 6 int is(int n,int m,int x,int y)
 7 {
 8     int xx=abs(x-n);
 9     int yy=abs(y-m);
10     if((xx==1&&yy==2)||(xx==2&&yy==1)||(n==x&&m==y)) return 0;
11     return 1;
12 }
13 long long d(int x,int y)
14 {
15     if(x<0||y<0) return 0;
16     else return dp[x][y];
17 }
18 int main()
19 {
20     int n,m,x,y,i,j;
21     cin>>n>>m>>x>>y;
22     for(i=0;i<=n;i++)
23     {
24         for(j=0;j<=m;j++)
25         {
26             if(j==0&&i==0) dp[i][j]=1;
27             else if(!is(i,j,x,y))
28             {
29                 dp[i][j]=0;
30             }
31             else dp[i][j]=d(i-1,j)+d(i,j-1);
32             //printf("%5lld",dp[i][j]);
33         }
34        // printf("\n");
35     }
36     printf("%lld\n",dp[n][m]);
37     return 0;
38 }
View Code