hdoj1028;他们说这题叫dp...
#include<cstdio>
#include<string>
#include<iostream>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;
long long dp[40][40];
char a[40][40];
int n;
//dp数组代表走到了(i,j)的方法;
//你要走到(i,j)的话肯定是从上或者从左边走到(i,j)然后就是大的for两层,在每个(i,j)for一下从上和从左到(i,j)的数字,
//如果可以的话,该点的dp[i][j]就加上那个可以的点的dp[i][j]值,不要觉得很奇怪,因为是可以的。在我无数次地试方法输出DP数组的时候
//就是ok了,这样写,我不知道为什么,啊哈哈哈哈,就是这样写,你要贴代码就贴代码,反正这题破DP就是自己完完全全地自己打出来的
//其实这道题目的意思不在这道题,想表达的意思是不要看题解做题,实在不会做看题解,主要看思路,然后可以叉掉题解,自己想然后打代码,
//实在不会,那肯定是有什么东西欠缺了,然后学一波,实在不行看别人的代码- -如果想变强就这么做
void debug()
{
printf("\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d",dp[i][j]);
}
printf("\n");
}
}
int main()
{
while(~scanf("%d",&n)&&n!=-1)
{
memset(dp,0,sizeof(dp));
dp[1][1]=1;
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
long long mm=-1;
if((a[i][j]-'0')==0&&i!=n&&j!=n)
continue;
for(int k=1;k<j;k++)
{
int t=a[i][k]-'0';
int y=j-k;
if(t==y)
{
if(i==1&&k==1||dp[i][k])
dp[i][j]+=dp[i][k];
}
}
for(int k=1;k<i;k++)
{
int t=a[k][j]-'0';
int y=i-k;
if(t==y)
{
if(k==1&&j==1||dp[k][j])
dp[i][j]+=dp[k][j];
}
}
}
}
debug();
printf("%lld\n",dp[n][n]);
}
return 0;
}