【动态规划】过河卒

原题传送门

思路


思路很简单,到达某个位置的路径的条数一定等于它上方和它右方两格的路径数之和,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;
}

猜你喜欢

转载自www.cnblogs.com/gongdakai/p/11437055.html