UVA - 825 Walking on the Safe Side (dp)

来源:互联网 发布:html在线图片编辑源码 编辑:程序博客网 时间:2024/05/22 17:10
题目大意:给出n,m,现在给出n行,每行有k(k为不定值)个数字,第一个数字代表行数, 后面k - 1个数代表当前行的这个位置不可走, 问有多少路径可以从(1,1)到(n,m),只能向下或向右。

解析:可以推出,该最短的路径一定为当前矩阵的行+列,dp[i][j]数组用于保存走到每个格子有多少种情况,dp[i+1][j] += dp[i][j]; dp[i][j+1] += dp[i][j];


#include <cstdio>#include <cstring>#include <cstdlib>#include <ctype.h>using namespace std;const int N = 200;int w,n;int grid[N][N];int dp[N][N];char str[N];int main() {int T;int x,y;scanf("%d",&T);while(T--) {scanf("%d%d",&w,&n);memset(grid,0,sizeof(grid));y = 0;for(int i = 1; i <= w; i++) {scanf("%d",&x);gets(str);int len = strlen(str);for(int i = 0; i <= len; i++) {if(isalnum(str[i])) {y = y * 10 + (str[i] - '0');}else {grid[x][y] = true;y = 0;}}}memset(dp,0,sizeof(dp));dp[1][1] = 1;for(int i = 1; i <= w; i++) {for(int j = 1; j <= n; j++) {if(!grid[i][j]) {dp[i+1][j] += dp[i][j];}if(!grid[i][j]) {dp[i][j+1] += dp[i][j];}}}printf("%d\n",dp[w][n]);if(T) {printf("\n");}}return 0;}

0 0