//兩堆數量為n(n<=20) 的牌,每個牌都有份數
//兩個人輪流拿牌,可以取兩堆數的頭或者尾中的一張
//每個人都取最優解
//問第乙個人能夠取得的最大分數
//記憶化搜尋 dp[sa][ta][sb][tb] 表示第一堆剩下sa,ta,第二堆剩下
//sb,tb的最大值
#include#include#includeusing namespace std ;
const int maxn = 21;
int dp[maxn][maxn][maxn][maxn] ;
int a[maxn], b[maxn] ;
int ss ;
int dfs(int sa ,int ta , int sb,int tb, int res)
if(sb <= tb)
dp[sa][ta][sb][tb] = ans ;
return ans ;
}int main()
for(int i = 1;i <= n;i++)
memset(dp,-1,sizeof(dp)) ;
printf("%d\n" , dfs(1,n,1,n,sum)) ;
}}
hdu 4597 dp 字首和 記憶化搜尋
dp i i len1 j j len2 sum i len1 i j j len2 min 因為每個人都足夠聰明,所以每個人作為先手時都會保證自己會得到最大受益,所以當前狀態下的最大收益就是區間總和減去轉換來的狀態裡收益最小的以獲得最大的收益,有一點博弈的思想,故用四維的陣列記錄狀態,然後用記憶化...
HDU1501 Zipper(DFS 記憶化搜尋)
題意 給三個字串,保證第三個串長度是前兩個串長度之和,確定前兩個串保持原有的字母順序能不能拼成第三個串。思路 直接搜尋的話會有大量重複的運算,要用記憶化陣列記錄之前的結果。當匹配到第乙個串的第i位和第二個串的第j位時,前面可能有多種情況,但三個串後面的長度一定,所以結果也可以確定,用vis i j ...
HDU 1072 記憶化搜 DFS BFS
題目大意 0為牆1為路2為起點3為終點4為炸彈 走到任意乙個炸彈都可以將所有炸彈重置倒計時6minutes 每走乙個位置需要1minutes 問從2到3需要的最少時間 dfs法更快。bfs法好理解。思路 兩種方法都需理解一點 同乙個炸彈位置當第二次走到時說明已不是最優解。bfs法 處理走到同乙個炸彈...