1. 程式人生 > >How many ways (記憶化搜尋)

How many ways (記憶化搜尋)

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


如上圖,機器人一開始在(1,1)點,並擁有4單位能量,藍色方塊表示他所能到達的點,如果他在這次路徑選擇中選擇的終點是(2,4) 

點,當他到達(2,4)點時將擁有1單位的能量,並開始下一次路徑選擇,直到到達(6,6)點。 
我們的問題是機器人有多少種方式從起點走到終點。這可能是一個很大的數,輸出的結果對10000取模。

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

PS:記憶化搜尋,用一個dp陣列記錄起點到該點的可行路徑數目。

#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<stack>
#include<string>
const int maxn=1e2+5;
const int mod=10000;
const int inf=1e9;
#define me(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
int maps[maxn][maxn],dp[maxn][maxn];
int n,m;
bool check(int x,int y)
{
    if(x<1||y<1||x>n||y>m)
        return 0;
    return 1;
}
int dfs(int x,int y)
{
    if(!dp[x][y])
    for(int i=0;i<=maps[x][y];i++)
        for(int j=0;i+j<=maps[x][y];j++)
            if(check(x+i,y+j)&&i+j)
                dp[x][y]=(dp[x][y]+dfs(x+i,y+j))%mod;
    return dp[x][y];
}
int main()
{
    int t;cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&maps[i][j]);
        me(dp,0);
        dp[n][m]=1;///遞迴出口
        cout<<dfs(1,1)<<endl;
    }
    return 0;
}

相關推薦

HDU 1978 How many ways記憶搜尋

   How many ways   Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other

How many ways 記憶搜尋

這是一個簡單的生存遊戲,你控制一個機器人從一個棋盤的起始點(1,1)走到棋盤的終點(n,m)。遊戲的規則描述如下:  1.機器人一開始在棋盤的起始點並有起始點所標有的能量。  2.機器人只能向右或者向下走,並且每走一步消耗一單位能量。  3.機器人不能在原地停留。  4.當機

How many ways記憶搜尋

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

hdu1978 How many ways記憶搜尋

題意:中文題。 思路:注意這題題中說“當機器人選擇了一條可行路徑後,當他走到這條路徑的終點時,他將只有終點所標記的能量”。剛開始這條件我就看了半天,這句話中明確指出大的能量轉移(不包括每走一步的能量減一)只有一個條件可以觸發,那就是到達終點,其他沒說明的就表明無法觸發

[HDU2157]How many ways??DP + 矩陣優化

per printf 需要 給定 get sizeof ref 傳送門 href 傳送門 k < 20 k這麽小,隨便dp一下就好了。。。 dp[i][j][k]表示從i到j經過k個點的方案數 4重循環。。 但是如果k很大就不好弄了 把給定的圖

Codeforces Round #197 (Div. 2): C. Xenia and Weights記憶搜尋

  題意: 先輸入一個長度為10的01串,第i個數字為1表示你有重量為i的砝碼無數個,第i個數字為0表示你沒有重量為i的砝碼,你需要按照以下規則在一個一開始平衡的天平上放上m個砝碼 第1個砝碼放在天平左邊,第2個砝碼放在天平的右邊,第3個砝碼放在天平左邊……依次

【ZOJ1107】FatMouse and Cheese記憶搜尋

題目連結 FatMouse and Cheese Time Limit: 10 Seconds      Memory Limit: 32768 KB FatMouse has stored some c

洛谷3257 [JLOI2014]天天酷跑DP記憶搜尋

題目 每次往上跳或往下掉或持平……(具體看題目吧),使路徑上的權值和最大。 題解 記憶化搜尋 設f[i][j][t]表示從出發點到(x,y)這個位置(不含這個位置,即減掉ma[x][y])還可以跳t次的最大權值和。 轉移方程 ,其中w表示這一路上的點權和。 下面說說前輩繞的彎路,

HDU 1078 FatMouse and Cheese 記憶搜尋

FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 &l

抵制克蘇恩記憶搜尋

題目描述 小Q同學現在沉迷爐石傳說不能自拔。他發現一張名為克蘇恩的牌很不公平。如果你不玩爐石傳說,不必擔心,小Q同學會告訴你所有相關的細節。爐石傳說是這樣的一個遊戲,每個玩家擁有一個 30 點血量的英雄,並且可以用牌召喚至多 7 個隨從幫助玩家攻擊對手,其中每個隨從也擁有自己的血量和攻擊力。小Q同學有很

3822 期望DP記憶搜尋

這道題的難點就在於狀態的設計,如果你只想了一會就來看這篇題解,我建議你多方面想想狀態的設計之後,若還是沒有思路再來看題解。 主要思路: 第一眼看過去是不是很多人都想如何存棋盤的狀態,但是我們並不需要每一行,每一列是怎麼放得,只需要知道有幾行放了,有幾列放了就可以了。同

UAV -10285 Longest Run on a Snowboard 記憶搜尋

題目連結 題目大意:     從矩陣中任意一個點出發,只要它上下左右的任意一個比它的數小,它就能向那個小的數字走一步,問在這個圖中走的最大的步數 題目分析:     如果用暴力搜尋的話可能會很麻煩,很費事,所以很典型的記憶化搜尋 Code:

3652 B-number 數位DP記憶搜尋

B-number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9200    Accepted Submis

1036C Classy Numbers 數位DP記憶搜尋

題意:在n到m區間內,有多少個數滿足每位數字非零的不超過3個(前導零無關)。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib>

小樂樂下象棋記憶搜尋

連結:https://ac.nowcoder.com/acm/contest/301/F 來源:牛客網   小樂樂一天天就知道玩,這一天又想玩象棋。 我們都知道馬走日。 現在給定一個棋盤,大小是n*m,把棋盤放在第一象限,棋盤的左下角是(0,0),右上角是(n - 1, m - 1);

poj 1088 滑雪 動態規劃記憶搜尋

ichael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個例子 1 2

POJ 1088 滑雪 記憶搜尋

                                                                滑雪 Time Limit:1000MS    Memory Lim

POJ 1088 滑雪記憶搜尋

Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維陣列給出。陣列的每個數字代表點的高度。下面是一個

HDU2517——How many ways??矩陣快速冪

How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1565    Accept

Free Candies記憶搜尋

給出4堆糖,往容量為5籃子裡裝任意一個在堆頂的糖,籃子裡有相同顏色的就拿走,問最多能拿走幾次。 定義四維陣列記憶搜尋。 #include<cstdio> #include<cstri