【動態規劃】過河卒

原題傳送門ios

思路


思路很簡單,到達某個位置的路徑的條數必定等於它上方和它右方兩格的路徑數之和,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;
}
相關文章
相關標籤/搜索