hdu4283區間dp 記憶化搜尋 區間分化

2021-06-17 01:12:57 字數 1173 閱讀 6097

題意:給你一些人的屌絲值di,計算總屌絲值=sum((k-1)*di),k為第i個人進入的位置。給你乙個棧,可以使人的位置改變。

方法一:記憶化搜尋

dp[i][j][k]表示區間[i,j]第i個人放在k位置的屌絲值。

搜尋所有的狀態,記錄已經搜尋的狀態。

**:

//記憶化搜尋

//這裡也可以用二維的陣列,另外用乙個sum陣列和。不過三維的實在是太神了

#include#include#include#include#include#include#include#define maxn 105

#define inf 0xfffffff

#define min(a,b) ab?a:b

using namespace std;

int n;

int dp[maxn][maxn][maxn];

int a[maxn];

int solve_dp(int s,int e,int k)

return dp[s][e][k];

}int main()}}

printf("case #%d: %d\n",tt++,solve_dp(1,n,1));

}return 0;

}

直接用for迴圈,先把小區間計算出來,計算大區間時轉化為小區間。

dp[i][j]表示區間[i,j]第i個人放在i位置的屌絲值。

**://三for遞推,把當前選擇對後續選擇的影響給提前計算了

//用sum陣列來存和,能夠在每次算區間的時候,把第乙個看成1

#include#include#include#include#include#include#include#define maxn 105

#define inf 0xfffffff

#define min(a,b) ab?a:b

using namespace std;

int n;

int dp[maxn][maxn];

int a[maxn],sum[maxn];

int solve_dp()

{ int i,j,len,s,e,k;//dp[i][j]是把i作為第乙個位置的值,思路也是把[i,j]區間分成兩個

int tp,front,rear;

for(len=1;len

hdu4283 經典區間dp

input 多組輸入用例t,每組第一行是小姐姐的數量,以下n行按照順序表示第1個到第n個小姐姐的耐心度m對於每組資料輸出,一行輸出乙個值,代表cry的最大快樂值,即小姐姐們耐心值的最小和。1 n 100,0 m 100 output 輸出cry的最大快樂值,具體輸出參照樣例。sample input...

!HDU 4283 屌絲聯誼會 區間dp

題意 一群屌絲排隊參加聯誼,每個人都有屌絲值,如果他是第k個進場的,那麼他的憤怒值就是 k 1 di,主辦方想使所有屌絲的憤怒值總和最小,就用乙個黑屋子來改變屌絲的進場順序,黑屋子實際上是乙個棧,先進後出。現在要求用這個棧能得到的最小的憤怒值總和是多少。分析 難點在於你不知道用了多少次黑屋子 用在哪...

ZJU1602 區間DP記憶化搜尋解法

中文大意 乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌。目標是使得分的和最小。例如,如果數是10 1 50 20 5,依次拿1 20 50,總分是10 1 ...