light oj 1422 Halloween Costumes (区间dp)
题目链接:http://vjudge.net/contest/141291#problem/D
题意:有n个地方,每个地方要穿一种衣服,衣服可以嵌套穿,一旦脱下的衣服不能再穿,除非穿同样的一件新的,问在满足题目要求的穿衣顺序下最少需要准备几件衣服。
思路:区间dp
//这个是看的别人的代码理解的,但是按照自己理解的写的代码样例正确,但是结果怎么都是WA的,不知道为什么,等我问问学长搞懂了再补题。//隔天改对了。
代码1:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long const int maxn=1e2+5; const int INF=0x3f3f3f3f; int dp[105][105]; int a[105]; int main(){ int T; scanf("%d",&T); for(int t=1; t<=T; t++){ int n; scanf("%d",&n); memset(dp,0,sizeof(dp)); for(int i=1; i<=n; i++){ scanf("%d",&a[i]); dp[i][i]=1; } for(int d=1; d<n; d++) ///区间长度 for(int i=1; i+d<=n; i++){ int j=i+d; 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+1][k]+dp[k+1][j]); } printf("Case %d: %d\n",t,dp[1][n]); } return 0; }
代码2:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long const int maxn=1e2+5; const int INF=0x3f3f3f3f; int dp[105][105]; int a[105]; int main(){ int T; scanf("%d",&T); for(int t=1; t<=T; t++){ memset(dp,INF,sizeof(dp)); int n; scanf("%d",&n); for(int i=1; i<=n; i++) {scanf("%d",&a[i]);dp[i][i]=1;} for(int d=1; d<n; d++) ///区间长度 for(int i=1; i+d<=n; i++){ int j=i+d; if(a[i]==a[j]) dp[i][j]=dp[i][j-1]; for(int k=i; k<j; k++) if(a[i]==a[k]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); } printf("Case %d: %d\n",t,dp[1][n]); } return 0; }
代码3:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long const int maxn=1e2+5; const int INF=0x3f3f3f3f; int dp[105][105]; int a[105]; int main(){ int T; scanf("%d",&T); for(int t=1; t<=T; t++){ memset(dp,INF,sizeof(dp)); int n; scanf("%d",&n); for(int i=1; i<=n; i++) {scanf("%d",&a[i]);dp[i][i]=1;} for(int j=2; j<=n; j++) ///区间 i是头,j是尾 for(int i=j-1; i>=1; i--){ if(a[i]==a[j])dp[i][j]=dp[i][j-1]; for(int k=i; k<j; k++) if(a[i]==a[k]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); } printf("Case %d: %d\n",t,dp[1][n]); } return 0; }