程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1978 How many ways(記憶化)

HDU 1978 How many ways(記憶化)

編輯:C++入門知識

HDU 1978 How many ways(記憶化)


Description

這是一個簡單的生存游戲,你控制一個機器人從一個棋盤的起始點(1,1)走到棋盤的終點(n,m)。游戲的規則描述如下:
1.機器人一開始在棋盤的起始點並有起始點所標有的能量。
2.機器人只能向右或者向下走,並且每走一步消耗一單位能量。
3.機器人不能在原地停留。
4.當機器人選擇了一條可行路徑後,當他走到這條路徑的終點時,他將只有終點所標記的能量。
vcq9tNPG8LXj19+1vdbVteOho9Xiv8nE3MrH0ru49rrctPO1xMr9o6zK5LP2tcS94bn7ttQxMDAwMMihxKOhowogCgoKCjxwIGNsYXNzPQ=="pst">Input

第一行輸入一個整數T,表示數據的組數。
對於每一組數據第一行輸入兩個整數n,m(1 <= n,m <= 100)。表示棋盤的大小。接下來輸入n行,每行m個整數e(0 <= e < 20)。

Output

對於每一組數據輸出方式總數對10000取模的結果.

Sample Input

1
6 6
4 5 6 6 4 3
2 2 3 1 7 2
1 1 4 6 2 7
5 8 4 3 9 5
7 6 6 2 1 5
3 1 1 3 7 2

Sample Output

3948
記憶化:對於每一種狀態搜索。
#include
#include
#include
#include
#include
using namespace std;
const int maxn=110;
int mp[maxn][maxn];
int dp[maxn][maxn];
int t,n,m;
int ok(int x,int y)
{
    if(x<1||x>n||y<1||y>m)
        return 1;
    else
        return 0;
}
int dfs(int x,int y)
{
    if(dp[x][y]>=0)
        return dp[x][y];
    dp[x][y]=0;
    for(int i=0;i<=mp[x][y];i++)
    {
        for(int j=0;j<=mp[x][y]-i;j++)//枚舉可以到達的點
        {
            if(ok(x+i,y+j))
                continue;
            dp[x][y]+=dfs(x+i,y+j)%10000;
        }
    }
    return dp[x][y];
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
               scanf("%d",&mp[i][j]);
        }
        memset(dp,-1,sizeof(dp));
        dp[n][m]=1;
        printf("%d\n",dfs(1,1)%10000);
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved