当前位置: 代码迷 >> 综合 >> poj 2704 Pascal's Travels 动态规划
  详细解决方案

poj 2704 Pascal's Travels 动态规划

热度:27   发布时间:2024-01-19 06:21:35.0

题意:

给一个n*n的矩阵,矩阵里的数表示在这个点能走的距离长度,只能向右走或者向下走,求从左上角到右下角一共有多少种走法。

分析:

简单dp,状态O(n^2):dp[i][j]表示到(i,j)有多少种走法;转移O(1):dp[i][j]=sum{dp[i][j-k]}(g[i][j-k]==k,1<=k<=9)+sum{dp[i-k][j]}(g[i-k][j]==k,1<=k<=9)。

代码:

//poj 2704
//sepNINE
#include <iostream>
using namespace std;
const int maxN=40;
int g[maxN][maxN];
__int64 dp[maxN][maxN]; 
char tmp[maxN];
int main()
{int n,i,j,k;while(scanf("%d",&n)==1&&n!=-1){for(i=1;i<=n;++i){scanf("%s",tmp);for(j=0;j<n;++j)g[i][j+1]=tmp[j]-'0';}memset(dp,0,sizeof(dp));dp[1][1]=1;for(i=1;i<=n;++i)for(j=1;j<=n;++j){for(k=1;k<=9;++k)if(i-k<1)break;else if(g[i-k][j]==k)dp[i][j]+=dp[i-k][j];	for(k=1;k<=9;++k)if(j-k<1)break;else if(g[i][j-k]==k)dp[i][j]+=dp[i][j-k];}printf("%I64d\n",dp[n][n]);}return 0;	
}


  相关解决方案