日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

8636 跳格子(dfs+记忆化搜索)

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8636 跳格子(dfs+记忆化搜索) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

8636?跳格子

該題有題解

時間限制:2457MS? 內存限制:1000K
提交次數:139 通過次數:46

題型: 編程題???語言: G++;GCC

?

Description

地上有一個n*m 的數字格子,每個格子有一個坐標(i,j)(其中1<=i<=n , 1<=j<=m),規定左上角為(0,0), 右下角為(n,m),你要從最左端的一列的任意位置開始跳到最右邊格子外。 下面兩條你跳的時候的約束規則: 一、因為你的力氣有限,每次只能跳一定的距離。給定一個k 為你的彈跳力,則從(i1,j1)起跳,你能跳到 任意(i2,j2)且符合k>=(i1-i2)*(i1-i2)+( j1-j2)*( j1-j2)。 二、每次你至少要向右走一格,也就是說你不能跳到同一列的格子上戒者往回跳。再換句話說就是依次跳 到的位置的坐標中,j 必須是遞增的。 每個格子里邊有一個分值,當你跳到那里就可以獲取到該格子的分數。 現在請你求出你最多能得多少分? 現在假設有一個5×6 的格子,你的彈跳能力為4,則如圖所示你能得到17 分。 跳躍路徑為(4,1)->(3,2)->(3,4)->(4,5)->(4,6)->跳出格子。




輸入格式

第一行包含一個整數T,表示T 個case。 每個case 第一行包含n m k 三個整數(1<=n,m,k<=100) 接下來n行,每行m個分值,格子里的分數的絕對值小于20000



輸出格式

輸出最大得分。



?

輸入樣例

1 5 6 4 1 2 -1 2 1 1 2 3 -1 2 3 1 3 4 -1 2 2 3 4 2 -1 1 3 4 3 1 -1 1 1 4



?

輸出樣例

17



?

題解

記憶化搜索。每次從第i行第一個開始深搜,記錄下搜過的點,下次如果再次搜到這個點就直接返回這個點的值就行了。
(ps:這題很多細節要注意,盡量少點一些沒必要的判斷,不然很容易超時)

#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n,m,k; int map[110][110]; int dp[110][110]; int DFS(int l,int r) {int maxn=-30000;if (r==m) return map[l][r];if (dp[l][r]) return dp[l][r];for (int i=1; i<=n; ++i)for (int j=r+1; j<=m; ++j)if ((i-l)*(i-l)+(j-r)*(j-r)<= k)maxn=max(maxn,DFS(i,j));dp[l][r]=maxn+map[l][r];return dp[l][r]; } int main() {int T;scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&k);memset(dp,0,sizeof(dp));for (int i=1; i<=n; ++i)for (int j=1; j<=m; ++j)scanf("%d",&map[i][j]);int maxn=-30000;for (int i=1; i<=n; ++i)maxn=max(maxn,DFS(i,1));printf("%d\n",maxn);}return 0; }

?

轉載于:https://www.cnblogs.com/scaugsh/p/5539392.html

總結

以上是生活随笔為你收集整理的8636 跳格子(dfs+记忆化搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。