Kai’blog

技术博客

【动态规划】过河卒

原题传送门

思路


思路很简单,到达某个位置的路径的条数一定等于它上方和它右方两格的路径数之和,DP即可。
但实际编码坑点重重,最重要的一点是:数组总TMD越界!!!烦......如此水的一道题都用了本蒟蒻40分钟,不敢直视自己的能力QAQ,只能都在墙后瑟瑟发抖......

Code


#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<map>
using namespace std;

int a[16][16],dp[16][16];

int main()
{
    int i,j,n,m,x,y;
    cin>>n>>m>>x>>y;
    for(i=0;i<=n;i++)
    	for(j=0;j<=m;j++)
    		a[i][j]=1;
    a[x][y]=0;
    a[x-1][y-2]=0;
    a[x-2][y-1]=0;
	a[x-2][y+1]=0;
    a[x-1][y+2]=0;
    a[x+1][y-2]=0;
    a[x+2][y-1]=0;
    a[x+2][y+1]=0;
    a[x+1][y+2]=0;
    for(i=0;i<=n;i++){if(a[i][0]==0)break;dp[i][0]=1;}
    for(j=0;j<=m;j++){if(a[0][j]==0)break;dp[0][j]=1;}
    for(i=1;i<=n;i++)
    	for(j=1;j<=m;j++)
    	{
    		if(a[i][j]==1)
    		{
    			dp[i][j]=dp[i-1][j]+dp[i][j-1];
			}
		}
    cout<<dp[n][m]<<endl;
    
    /*
	for(i=0;i<=n;i++)
    {
		for(j=0;j<=m;j++)
    		cout<<a[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
    for(i=0;i<=n;i++)
    {
		for(j=0;j<=m;j++)
    		cout<<dp[i][j]<<" ";
		cout<<endl;
	}
    */
    
    return 0;
}

posted @ 2019-08-30 20:50  Kai02  阅读(226)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱大垲. All rights reserved.