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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖:

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

”奪寶奇兵”從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5-> 7-> 8-> 3-> 7的順序,將得到最大值30
輸入
第一行正整數N(100> =N> 1),表示山的高度
接下來有N行非負整數,第i行有i個整數(1< =i< =N),表示山的第i層上從左到右每條路上的珠寶數目
輸出
一個整數,表示從山底到山頂的所能得到的珠寶的最大數目.
樣例輸入

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

樣例輸出

30

首先,我們直接從上往下dfs。

代碼如下:

#include <iostream> using namespace std; const int N = 110; int mp[N][N]; int dp[N][N]; int n;int dfs(int x, int y) {if (x == n)return mp[x][y];return dp[x][y] = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + mp[x][y]; }int main() {cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++)cin >> mp[i][j];dfs(1, 1);cout << dp[1][1] << endl;return 0; }

可以看到超時,而且時間是2358

現在我們記憶化搜索。

代碼如下:

#include <iostream> #include <cstring> using namespace std; const int N = 110; int mp[N][N]; int dp[N][N]; int n;int dfs(int x, int y) {if (x == n)return mp[x][y];if (dp[x][y] >= 0)//實現記憶化搜索return dp[x][y];return dp[x][y] = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + mp[x][y]; }int main() {cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++)cin >> mp[i][j];memset(dp, -1, sizeof(dp));dfs(1, 1);cout << dp[1][1] << endl;return 0; }

時間變成了1。

用dp的話,時間為2,比記憶化搜索慢一點。

  • [藍橋杯][算法提高VIP]奪寶奇兵-dp
  • 總結

    以上是生活随笔為你收集整理的[蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

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