LightOJ 1422 Halloween Costumes(區間dp)
阿新 • • 發佈:2018-12-12
題意:
題意:給你n天分別要穿的衣服編號,可以套著穿,但是一旦脫下來就不能再穿了,問這n天最少要準備幾件衣服。
思路:
(很少做區間dp),dp[i][j]表示i-j天最少穿的衣服。
從後往前每次更新i時,dp[i][j]預設等於dp[i+1][j],預設和之前衣服都不一樣。
然後在i-j之間找與i相同衣服,如果有的話,更新,就是直到k一直不脫,這樣在k時就可以一直脫到i,用i的衣服就行了
#include <bits/stdc++.h> using namespace std; const int maxn = 109; int num[maxn]; int dp[maxn][maxn]; int main() { int m,n,t; int cnt=1; cin>>t; while(t--) { memset(dp,0,sizeof dp); cin>>n; for(int i=1; i<=n; i++) cin>>num[i]; for(int i=n; i>=1; i--) for(int j=i; j<=n; j++) { dp[i][j]=dp[i+1][j]+1; for(int k=i+1; k<=j; k++) { if(num[k]==num[i]) { dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]); } } } printf("Case %d: %d\n",cnt++,dp[1][n]); } return 0; }