Atcoder DP Contest pC

題敘

https://atcoder.jp/contests/dp/tasks/dp_c
每天都有三種活動可以選擇,且有各自價值
本次選擇的活動與上次選擇的不能相同,求第 $n$ 天的最大價值總和

想法

對於點 $1$ 到點 $n-1$ ,每個點都只能選兩種狀態,取其最大值即可
定義 $DP[i][j]$ 表示第 $i$ 天選擇第 $j$ 種活動時的最大價值總和
則有轉移式 $DP[i][j] = max(DP[i][s], DP[i-1][t])+arr[i][j],\ s \neq j,\ t\neq j,\ s\neq t$

閱讀全文 »

UVa12455

題敘

http://domen111.github.io/UVa-Easy-Viewer/?12455

想法

對於每個長度的棍子都可以用其他棍子組合而成
定義 $DP[i]$ 表示可以組成長度i的棍子
則有 $DP[i] = DP[i-k] ,k \leq i$
對於每個棍子都看看能不能透過這個棍子與其他棍子的組合組成新的長度

閱讀全文 »

題敘

http://domen111.github.io/UVa-Easy-Viewer/?10702

想法

從 $i$ 走到 $j$ 可以先經過 $k$
定義 $DP[n][i][j]$ 表示從 $i$ 走$n$步到 $j$ 的最大價值
轉移式: $DP[n][i][j] = max(DP[n][i][j], DP[n-1][i][k] + DP[1][k][j])$
且 $DP[1][i][j] = arr[i][j] (i \neq j)$
要記得當$i=j$時要走一步是不可能的

Code:

閱讀全文 »

UVa11258

題敘

http://domen111.github.io/UVa-Easy-Viewer/?11258

想法

定義$DP[i][j]$為 $i$ ~ $j$ 的最佳解
設定轉移式 $DP[i][j] = max(DP[i][j], DP[i][k]+DP[k+1][j])$
其中, $k$ 符合 $i\leq k \leq j$
起初,我們可以假設$DP[i][j]$為 $i$ ~ $j$ 的數值
如果超過INT範圍則設定為0,也就是不會有這樣的可能
接下來針對每個$DP[i][j]$找最大值,答案即為$DP[0][s.size()-1]$

閱讀全文 »

UVa10684

題敘

想法1

直觀的看,暴力去找起點跟終點 $i,j$
複雜度$O(N^2)$

Code1

閱讀全文 »

UVa116

題敘

http://domen111.github.io/UVa-Easy-Viewer/?116

想法

實作dfs很簡單,但是需要能回朔解
這邊想到用陣列去記錄每個點要前往的x座標,而y座標固定是+1,故不紀錄
在更新Min_dis要特別注意維護x較小的要在前
並且當Min_dis已經為最小值時DFS可以直接return減少遞迴時間

閱讀全文 »

UVa10102

題敘

想法

針對每個起點(1)做BFS,找到最近的3得到距離,再從其中找最大值

Code

閱讀全文 »