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;
}
posted @ 2016-04-09 00:24  see_you_later  阅读(105)  评论(0编辑  收藏  举报