

4 2331 1213 1231 3110 4 3332 1213 1232 2120 5 11101 01111 11111 11101 11101 -1
3 0 7
简单dp,从起点开始每次走到一个格子,记下到达该点的原路线数目加上这次的路线数目,重复执行。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
using namespace std;
#define N 100
#define ll __int64
const int inf=0x7fffffff;
ll a[N][N];
ll dp[N][N];
char s[N][N];
int main()
{
int i,j,n,u,v,t;
while(scanf("%d",&n),n!=-1)
{
for(i=0;i<n;i++)
scanf("%s",s[i]);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]=s[i][j]-'0';
dp[i][j]=0;
}
}
dp[0][0]=1;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==n-1&&j==n-1) //到达终点,防止累加错误
continue;
if(!dp[i][j]||!a[i][j]) //此路不通
continue;
t=a[i][j]; //每一步都只能直走,中途不能拐弯
u=i+t;
v=j;
if(u<n&&v<n)
{
dp[u][v]+=dp[i][j];
}
u=i;
v=j+t;
if(u<n&&v<n)
{
dp[u][v]+=dp[i][j];
}
}
}
printf("%I64d\n",dp[n-1][n-1]);
}
return 0;
}
hdu 1208 Pascal's Travels (子状态继承dp)
原文:http://blog.csdn.net/u011721440/article/details/44700309