uva 116 (記憶化搜尋)

2021-06-29 02:18:44 字數 1070 閱讀 4031

題意:

如圖,從左到右走,每次可以往左上(up)左(fo)左下(dn)走,當走到第一行或最後一行時可以如圖穿越。

求一條權值最小的路徑,並列印字典序最小的路徑。

解析:狀態轉移方程:

dp[ i ][ j ] = min( dp[ (i - 1 + m) % m ] [ j + 1 ],    //up

dp[ i ] [ j + 1],                               //fo

dp[ ( i + 1) % m ] [ j + 1] )          //dn

字典序最小的路徑也在記憶化搜尋中更新,詳見**。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

using namespace std;

const int maxr = 10 + 10;

const int maxc = 100 + 10;

const int inf = 0x3f3f3f3f;

int g[maxr][maxc];

int path[maxr][maxc];

int dp[maxr][maxc];

int m, n;

int dfs(int i, int j)

int main()

}int ans = inf;

int pos = -1;

for (int i = 0; i < m; i++)

}printf("%d", pos + 1);

pos = path[pos][0];

for (int i = 1; i < n; i++)

printf("\n%d\n", ans);

}return 0;

}

UVA116 簡單的多階段DP

題意 m行n列的矩陣,求從一邊到另一邊的最短路。矩陣的最頂端和最底端是相連的。題解從最後一列開始逆推,求最短路並記錄下來。在記錄最短路的過程中,如果某一列存在兩個最優解的情況,選擇字典序小的那個最優解。最後把記錄下來的最短路輸出即可。注意事項 注意m行1列的情況,被這種情況坑了好久。include ...

uva10626(記憶化搜尋)

題目大意 一瓶可樂需要花8元,自動販售機只收1元,5元,10元。每次插入的錢只能買一瓶。給出n瓶可樂,請問最少插入幾次錢可以買到所需要數量的可樂。思路 一共有以下幾種情況 8個1元 插入8次 3個1元 乙個5元 插入4次 3個1元 乙個10元 插入4次 找5元 1個10元 插入1次 找2 1元 2個...

UVA 1629 記憶化搜尋

有乙個n行m列的蛋糕,切蛋糕,要求最後每一塊蛋糕上恰好有乙個櫻桃。問切割線總長度最小是多少?記憶化搜尋。設dp l r u d 為切割從橫向從l到r,縱向從u到d的一塊蛋糕,切割線總長度的最小值。然後不斷dfs搜尋並記錄dp值,最後dp 0 m n 0 即為所求。include include in...