Codevs1010 过河卒 【简单DP】【细心】

来源:互联网 发布:网络贷款需要什么资料 编辑:程序博客网 时间:2024/05/22 00:06

这题需要注意的点是
第一种初始化表格边界的方式是:

    f[1][1] = 1;

循环内部是这样写的

            if(i - 1 > 0) f[i][j] += f[i-1][j];            if(j - 1 > 0) f[i][j] += f[i][j-1]; 

第二种是

    for(int i=0; i<=n; i++){        if(!b[i][0])f[i][0] = 1;        else if(b[i][0]) break;    }    for(int i=0; i<=m; i++){        if(!b[0][i])f[0][i] = 1;        else if(b[0][i]) break;    }

初始化x轴和y轴 但是在初始化之后要去处理那些题目给出的不能走的点
如果提前把不能走的点设置好了,这里初始化又会把那些点设置回去

#include <cstdio>int f[1000][1000];int b[1000][1000];int main(){    int m,n;    int c1,c2;    scanf("%d%d%d%d",&n,&m,&c1,&c2);    b[c1][c2]=1;    b[c1-2][c2-1]=1;    b[c1-1][c2-2]=1;    b[c1+2][c2+1]=1;    b[c1+1][c2+2]=1;    b[c1-2][c2+1]=1;    b[c1-1][c2+2]=1;    b[c1+1][c2-2]=1;    b[c1+2][c2-1]=1;    for(int i=0; i<=n; i++){        if(!b[i][0])f[i][0] = 1;        else if(b[i][0]) break;    }    for(int i=0; i<=m; i++){        if(!b[0][i])f[0][i] = 1;        else if(b[0][i]) break;    }    for(int i=1; i<=n; i++){        for(int j=1; j<=m; j++){            f[i][j]=f[i][j-1]+f[i-1][j];            if(b[i][j])            f[i][j]=0;        }    }    printf("%d",f[n][m]);    return 0;}
原创粉丝点击