題意:給你一些人的屌絲值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 ...