码迷,mamicode.com
首页 > 其他好文 > 详细

关于DP与DFS

时间:2019-11-23 23:30:46      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:getchar   矩形   define   problem   efi   code   http   https   stream   

在二维矩阵上的DFS只有两个方向时,沿着矩形某一个角的方向时,有些问题可以转化为DP来求,同时,这种情况一般无法用DFS来求,因为n与m的值特别大
比如求出从一个角到另一个角的路径有几种
----
下面是求出从左上角到右下角的路径种类

dp[0][1]=1
for(int I=1;i<=n;i++){
    for(int j=1;j<=m;j++){
        dp[i][j]=dp[i-1][j]+dp[i][j-1];
    }
}

初始化的时候注意只初始化起始点即可,不然会和后面的条件冲突
(牛客小白赛就是因为这个原因wa了QAQ)

传送门

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const int maxn = 3e3+5;
const int inf = 0x3f3f3f3f;
const int mod = 2333;
int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    return f*x;
}
int n,m;
int dp[maxn][maxn];
int a[maxn][maxn];
void DP(){
    dp[n][0]=1;
    for(int i=n;i>=1;i--){
        for(int j=1;j<=m;j++){
            if(a[i][j]==0)dp[i][j] = (dp[i][j-1]+dp[i+1][j]) % mod;
            else dp[i][j]=0;
        }
    }
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            a[i][j]=read();
        }
    }
    DP();
    cout<<dp[1][m]<<endl;
    return 0;
}

传送门
过河卒也是这个思想
```

关于DP与DFS

标签:getchar   矩形   define   problem   efi   code   http   https   stream   

原文地址:https://www.cnblogs.com/Emcikem/p/11920511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!