題意(大概翻譯):
小憨憨 參加聖誕節的一些派對,並且需要穿上對應派對的衣服,所以他需要多次換衣服,為了方便,他可以選擇脫掉一些衣服或者穿上新衣服,比如說,他穿著 美隊 的衣服,外面又穿著 鋼鐵俠 的衣服,當他要參加 美隊 服裝派對時,他可以選擇脫掉 鋼鐵俠 的衣服(因為 鋼鐵俠 衣服的裡面有 美隊 的衣服),或者他可以在穿一件 美隊 的衣服,小憨憨 是個愛乾淨的人,當他脫下 鋼鐵俠 的衣服後,如果需要再穿 鋼鐵俠 的衣服,他會選擇再穿一件新的。(如果他先穿a衣服,又穿上b衣服,再穿一件c衣服,如果他想讓最外面的衣服是a,他可以選擇直接穿一件a,或者先把c脫掉,再把b脫掉)。
輸入:
2412127
1211
321
輸出:
case 1: 3case
2: 4
思路: 假設參加 n個派對, 存在i,j使得 1 <= i <= j <= n。啥都不考慮的情況下,那麼從i~j就需要 j-i+1件衣服(第乙個派對也要穿,即乙個派對換一件衣服),根據這個情況來賦初值 dp[i][j] = j-i+1;
然後再考慮狀態轉移方程,即 從i~j個派對會不會有重複的派對k(衣服k)出現,即出現a[k] = a[i] (k > i),即可以少一件衣服 ,那麼得到遞推方程為 :
dp[i][j] = min(dp[i][j], dp[i+1][k-1] + dp[k][j]);
**如下:
#include#include#define min(a,b) ((a) < (b)? (a):(b))
const
int maxn = 110
;int
dp[maxn][maxn],a[maxn];
intn,t,cas;
intmain()
for(int i=n-1 ;i>=1 ;i--) //
反著來,第一行的就是最小的
for(int j=i ;j<=n ;j++)
printf(
"case %d: %d\n
",cas+1, dp[1
][n]);
} return0;
}
區間dp LightOJ 1422 萬聖節服裝
題目大意 有n個宴會,對於每乙個宴會,女主角都要穿一種禮服,禮服可以套著穿,但是脫了的不能再用,參加宴會必須按順序來,從第乙個到第n個,問參加這些宴會最少需要幾件禮服。樣例一解釋 第一天穿1號衣服,第二天套2號衣服。第三天把2號衣服脫了。第四天再穿一件2號衣服。因為脫了的衣服不能在穿,所以需要兩件2...
萬聖節派對
時間限制 1000 ms 記憶體限制 65535kb 難度 1 描述 萬聖節有乙個party,xadillax顯然也要去湊熱鬧了。因為去湊熱鬧的人數非常龐大,幾十w的數量級吧,自然要進場就需要有門票了。很幸運的,xadillax竟然拿到了一張真 門票!這真 門票的排列規則有些奇怪 門票號是由0 6組...
萬聖節派對
門票號是由0 6組成的六位數 0 6這幾個數字可重用 過濾每乙個門票號 第乙個過濾條件 每一位不能有三個連續相同的數字 如123335是不行的 第二個過濾條件 每乙個門票號相鄰的兩位相差必須在四以下 4 如016245是不行的 輸入第一行乙個n,代表輸入個數 接下去n行,每行兩個數字x,y x y ...