1. 程式人生 > >數字三角形問題,記憶化搜尋

數字三角形問題,記憶化搜尋

//數字三角形問題:動態規劃策略態規劃策略:d(i,j)=a(i,j)+max(d(i+1,j),d(i+1,j+1))

1.回溯法:最大權重路徑問題

2.遞迴(記憶化搜尋)

3.遞推

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
//遞迴過程會深搜到最後一層最左邊的一個元素
//遞迴過程中只有第一個棧返回的值才是整個遞迴過程的返回值,中間return的返回值除了返回給上一個棧一個值之外還有爆棧的作用
//數字三角形問題可以用搜索策略解決,即回溯法框架
//另外遞迴發,遞推運算,記憶話搜尋也可以解決

//動態規劃策略:d(i,j)=a(i,j)+max(d(i+1,j),d(i+1,j+1))
const int maxn=10000;
int shz1[maxn][maxn],shz2[maxn][maxn];
int n;//層數

//數字三角形的遞迴方法
int solve1(int i,int j){           
    return shz1[i][j]+(i==n? 0:max(solve1(i+1,j),solve1(i+1,j+1)) );//shz1[i][j] 為本層父節點,max取下一層子節點,返回第一個根節點的最大權重;
}                                                                   //i==n邊界處理,深搜到最後一層
//數字三角形的遞推方法
//int i,j;
//for(j=1;j<=n;j++) d[n][j]=a[n][j];
//for(i=n-1;i>=1;i--)
//   for(j=1;j<=i;j++)
//      d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);

//記憶化搜尋方法
int solve(int i,int j){
    if(shz2[i][j]>=0)return shz2[i][j];//記憶 已經處理過的節點不再處理,防止了多重訪問
    return shz2[i][j]=shz1[i][j]+(i==n? 0:max(solve(i+1,j),solve(i+1,j+1)));//搜尋
}
int main(){
    cin>>n;//層數 節點個數為1+2+...n=n*(n-1)/2
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++)
            cin>>shz1[i][j];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++)
            cout<<shz1[i][j]<<" ";
        cout<<endl;
    }
    
    cout<<solve1(1,1)<<" 遞迴"<<endl;
    memset(shz2,-1,sizeof(shz2));
    cout<<solve(1,1)<<" 記憶化搜尋"<<endl;
}

相關推薦

數字三角形問題記憶搜尋

//數字三角形問題:動態規劃策略態規劃策略:d(i,j)=a(i,j)+max(d(i+1,j),d(i+1,j+1)) 1.回溯法:最大權重路徑問題 2.遞迴(記憶化搜尋) 3.遞推 #include<cstdio> #include<iostream

ACM-ICPC 2018 徐州賽區網路預賽 B. BE, GE or NE(博弈記憶搜尋

樣例輸入1 3 -8 5 -5 3 1 1 2 0 1 0 2 1 樣例輸出1 Good Ending 樣例輸入2 3 0 10 3 0 0 1 0 10 1 0 2 1 樣例輸出2 Bad Ending 題意:A,B玩遊戲,n輪,A先手,給一個數字

斐波那契數列陣列遞推普通遞迴記憶搜尋矩陣快速冪和公式法

直接數列遞推推的時候是O(n)的複雜度,查詢的時候是O(1),但是當n很大的時候,陣列空間可能有點力不從心 #include <iostream> #include <cstdio> using namespace std; int fb[4

[ACM] FZU 2092 收集水晶 (DFS記憶搜尋

shadow來到一片神奇的土地,這片土地上不時會出現一些有價值的水晶,shadow想要收集一些水晶帶回去,但是這項任務太繁雜了,於是shadow讓自己的影子脫離自己併成為一個助手來幫助自己收集這些水晶。 shadow把這片土地劃分成n*m個小方格,某些格子會存在一些shadow和他的影子都無法穿越的障礙,比

數字三角形——遞迴、遞推、記憶搜尋

數字三角形 描述:          有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數。 問題:              從第一行的數開始,每次可以往

動態規劃——數字三角形(遞迴or遞推or記憶搜尋

1、題目大意: 有一個由非負整陣列成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數,如圖         1       3  2     4  10  1    4  3  2  20 從第一行的數開始,每次可以往左下或右下走一格,直到走到最下

NYOJ37、1023、15(迴文串、括號匹配、記憶搜尋、dp區間dp)

  迴文字串 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 輸入 第一行給出整數N(0<N<100) 接下來的N行,每行一個字串,每個字串長度不超過1000. 輸出 每行輸出所需新增的最少字元數

【牛客 - 301哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)】小樂樂下象棋(記憶搜尋dpdfs)

題幹:   小樂樂一天天就知道玩,這一天又想玩象棋。 我們都知道馬走日。 現在給定一個棋盤,大小是n*m,把棋盤放在第一象限,棋盤的左下角是(0,0),右上角是(n - 1, m - 1); 小樂樂想知道,一個馬從左下角(0, 0)開始,走了k步之後,剛好走到右上角(n - 1,

洛谷P1141 01迷宮 經典 Dfs + 記憶搜尋並查集

將方向用自定義陣列迴圈化 ,讀入時注意字串處理,走過的地方記憶化。並查集,不同聯通塊採用不同顏色標記記憶,方便多次查詢。並記憶每種顏色染色數量(即聯通塊大小)。 #include<cstdio&

Codeforces Round #390 (Div. 2)(A,B,C(記憶搜尋),D(貪心優先佇列))

/* Codeforces Round #390 (Div. 2) 時間: 2017/02/16 A. Lesha and array splitting 題意:將集合分成幾個小集合,要求小集合的和不為0. 題解:遍歷過去,一直到不滿足集合並數字非0前生成一個集合 */ #

51Nod-1009 數字1的數量【數位DP+記憶搜尋

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。 Input 輸入N(1 <= N <= 10^9) Output 輸出包

BZOJ 1048: [HAOI2007]分割矩陣 記憶搜尋二維字首和

Description   將一個a*b的數字矩陣進行如下分割:將原矩陣沿某一條直線分割成兩個矩陣,再將生成的兩個矩陣繼續如此分割(當然也可以只分割其中的一個),這樣分割了(n-1)次後,原矩陣被分割成了n個矩陣。(每次分割都只能 沿著數字間的縫隙進行)原矩

2018 08 08DFS入門之記憶搜尋

dfs很容易解決是否有解的問題,因為dfs會遍歷所有情況。從這個層面上講,說它暴力可真是沒毛病。 不過,太暴力肯定是不行的,因為有的題目可能的狀態太多,直接暴力會超時。 下面這道例題就是這樣,它的不同之處在於使用了記憶化搜尋。從這個角度看,倒和動態規劃有些類似。 這裡採

[Usaco2006 Oct]Another Cow Number Game 奶牛的數字遊戲 記憶搜尋

奶牛們又在玩一種無聊的數字遊戲。輸得很鬱悶的貝茜想請你寫個程式來幫她在開局時預測結果。在遊戲的開始,每頭牛都會得到一個數N(1<=N<=1,000,000)。此時奶牛們的分數均為0。如果N

Twenty Questions(記憶搜尋狀態壓縮dp)

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #inclu

CodeForces - 793D 區間dp記憶

記憶化 ini %d 單向 ble targe set skip ref CodeForces - 793D 題意:一條筆直街道上有標號為 1~n 的 n 個點,有 m 條帶邊權的單向邊。要找一條經過 k 個點的路徑和,限制:每次走過的邊不能跨過已走過的點。 比如點 3

簡單的動態規劃數字三角形以及做題思路。

數值 space 鏈接 分析 ios style iostream 循環 turn 鏈接 一句話題目:給出一個n層的三角形,每個位置有一個數字,到達後可獲得,求到達最低層能達到的最大數字和。 題目分析: 首先我們考慮能不能用搜索做,因為對於一個坐標,我們只有向下

ACM-ICPC 2018 徐州賽區網絡預賽 B BE, GE or NE(博弈記憶搜索)

兩個人 sin acm-icpc cout 最優 eof mes 數組 bit 鏈接https://nanti.jisuanke.com/t/31454 思路 開始沒讀懂題,也沒註意看數據範圍(1000*200的狀態,記憶化搜索隨便搞) 用記憶化搜索處理出來每個狀態的勝負

洛谷P1141 01迷宮(dfs或bfs回溯更新問題記憶或者並查集根結點)

ace else 賦值 www int iomanip 什麽 使用 algorithm 題目鏈接:https://www.luogu.org/problemnew/show/P1141 題目相當於求聯通塊,這個比較簡單,但加上了m次詢問後就是難點所在,很容易超時。 一定

【10.31校內測試】【組合數學】【記憶搜尋/DP】【多起點多終點二進位制拆位Spfa】

Solution   注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long using namespace std; int n, a, b;