當(dāng)前位置:
首頁(yè) >
hdu1978 简单记忆化搜索
發(fā)布時(shí)間:2025/6/17
25
豆豆
生活随笔
收集整理的這篇文章主要介紹了
hdu1978 简单记忆化搜索
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
How many ways
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2672 Accepted Submission(s): 1566
Problem Description 這是一個(gè)簡(jiǎn)單的生存游戲,你控制一個(gè)機(jī)器人從一個(gè)棋盤(pán)的起始點(diǎn)(1,1)走到棋盤(pán)的終點(diǎn)(n,m)。游戲的規(guī)則描述如下:
1.機(jī)器人一開(kāi)始在棋盤(pán)的起始點(diǎn)并有起始點(diǎn)所標(biāo)有的能量。
2.機(jī)器人只能向右或者向下走,并且每走一步消耗一單位能量。
3.機(jī)器人不能在原地停留。
4.當(dāng)機(jī)器人選擇了一條可行路徑后,當(dāng)他走到這條路徑的終點(diǎn)時(shí),他將只有終點(diǎn)所標(biāo)記的能量。
如上圖,機(jī)器人一開(kāi)始在(1,1)點(diǎn),并擁有4單位能量,藍(lán)色方塊表示他所能到達(dá)的點(diǎn),如果他在這次路徑選擇中選擇的終點(diǎn)是(2,4)
點(diǎn),當(dāng)他到達(dá)(2,4)點(diǎn)時(shí)將擁有1單位的能量,并開(kāi)始下一次路徑選擇,直到到達(dá)(6,6)點(diǎn)。
我們的問(wèn)題是機(jī)器人有多少種方式從起點(diǎn)走到終點(diǎn)。這可能是一個(gè)很大的數(shù),輸出的結(jié)果對(duì)10000取模。
Input 第一行輸入一個(gè)整數(shù)T,表示數(shù)據(jù)的組數(shù)。
對(duì)于每一組數(shù)據(jù)第一行輸入兩個(gè)整數(shù)n,m(1 <= n,m <= 100)。表示棋盤(pán)的大小。接下來(lái)輸入n行,每行m個(gè)整數(shù)e(0 <= e < 20)。
Output 對(duì)于每一組數(shù)據(jù)輸出方式總數(shù)對(duì)10000取模的結(jié)果.
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
思路:
? ? ? 直接記憶化搜索就行了,水題沒(méi)啥好說(shuō)的,還有就是提示一點(diǎn),不是錢(qián)全花沒(méi)了才可以停,中途也可以直接停下來(lái)去走另一條路,別的沒(méi)啥,既然是記憶化搜索那么也應(yīng)該可以用dp去寫(xiě),因?yàn)槿绻豢紤]實(shí)現(xiàn)的復(fù)雜度的話,我個(gè)人認(rèn)為記憶化搜索本身就是dp,給出記憶化搜索的代碼吧。
#include<stdio.h> #include<string.h> int mark[110][110]; int hash[110][110]; int map[110][110]; int n ,m;int abss(int x) {return x > 0 ? x : -x; }int DFS(int x ,int y) {if(mark[x][y]) return hash[x][y];if(x == n && y == m) return 1;int sum = 0;for(int i = x ;i <= x + map[x][y] && i <= n;i ++)for(int j = y ;j <= y + map[x][y] && j <= m ;j ++){int dis = abss(i - x) + abss(j - y);if(dis > map[x][y] || dis == 0) continue;sum += (DFS(i ,j) % 10000);}mark[x][y] = 1;hash[x][y] = sum % 10000;return sum; }int main () {int t ,i ,j;scanf("%d" ,&t);while(t--){scanf("%d %d" ,&n ,&m);for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++)scanf("%d" ,&map[i][j]);memset(mark ,0 ,sizeof(mark));printf("%d\n" ,DFS(1 ,1) % 10000);}return 0; }
總結(jié)
以上是生活随笔為你收集整理的hdu1978 简单记忆化搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hdu4530 水题
- 下一篇: hdu2067 简单dp或者记忆化搜索