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