這題一看就知道是區間dp 狀態定義很簡單 但是在寫**的時候 有個地方一直錯 錯到我** 下面**中有寫
d(x,y,k,h)表示x行到y行 k列到h列的最少數 也就是子矩形的寬度和高度
d(x,y,k,h)=min(d(x,i,k,h)+d(i,y,k,h)+h-k) 列的列舉也是如此
#include #include using namespace std;
const int inf = 0x3f3f3f3f;
int n,m,l,d[25][25][25][25];
int map[25][25];
int getsum(int x,int y,int k,int h)
return sum;
}int dp(int x,int y,int k,int h)//表示的半開半閉
{ int &ans=d[x][y][k][h];
if(ans!=-1) return ans;
int num=getsum(x,y,k,h);
if(num==1) return ans=0;//如果只有乙個了就不用分了
if(!num) return ans=inf;//如果0個 那麼就是不能這樣分 放回無窮大
ans=inf;
for(int i=x+1;i
區間DP 記憶化搜尋 乘法遊戲
乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌。你的目標是使得分的和最小。例如,如果數是10 1 50 20 5,依次拿1 20 50,總分是 10 1 50...
記憶化搜尋
演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...
記憶化搜尋
記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...