【解题报告】[动态规划]-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(马的位置和马的控制点)
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }