-
B - Halloween Costumes
- LightOJ - 1422
- 那么对于第 i 件衣服,我们有
- 1.如果在之后的区间内都不再重复利用这件衣服,那么明显 dp[i][j] = dp[i+1][j] + 1;
- 2.如果在之后的区间 i+1 ~ j 中存在一件衣服 k 是跟 i 一样的,那么我们便可以将i那件衣服在k这个地方重复利用,
- 那么转移方程为 dp[i][j] = min(dp[i][j] , dp[i][k-1]+dp[k+1][j]);
-
#include<iostream> using namespace std; #define maxn 123 int dp[maxn][maxn]; int n,a[maxn],t; int main() { cin>>t; for(int q=1; q<=t; q++) { cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) dp[i][j]=j-i+1; for(int i=n-1; i>=1; i--) for(int j=i+1; j<=n; j++) { dp[i][j]=dp[i+1][j]+1; for(int k=i+1; k<=j; k++) if(a[i]==a[k]) dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]); } cout<<"Case "<<q<<":"<<dp[1][n]<<endl; } return 0; }
B - Halloween Costumes -区间DP
最新推荐文章于 2019-09-28 20:18:17 发布