LightOJ 1422 Halloween Costumes (区间DP)

来源:互联网 发布:手机数据为啥自动打开 编辑:程序博客网 时间:2024/06/04 18:49

题意:Gappu有N个聚会要去参加,每个聚会需要穿第ci件服装,每到一场聚会,Gappu可以在现在穿的衣服上再套上需要穿的服装,如果里层穿有需要的服装,也可以选择脱去外层的服装直到那件需要的,脱掉了的衣服不能再穿,问最后至少需要多少件服装。

思路:

设dp[i][j] 为区间i到j至少需要的服装数。

状态转移方程:

dp[i][j] = dp[i+1][j] + 1;

dp[i][j] = min(dp[i][j],dp[i+1][k] + dp[k+1][j]) (a[k] = a[i])

方程意义:k为第i个场合穿的服装穿在身上的最后的场合,所以在k+1往后便是重新算起,而k之前的服装数为dp[i+1][k]。

我的代码:

#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn = 105;const int INF = 0x3f3f3f3f;int n,a[maxn];int dp[maxn][maxn];int main(){    int cas;    scanf("%d",&cas);    for(int T = 1; T <= cas; T++){        scanf("%d",&n);        for(int i = 0 ;i < n ; i++)            scanf("%d",&a[i]);        memset(dp,0,sizeof(dp));        for(int i = n - 1 ; i >= 0 ; 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(a[k] == a[i]) dp[i][j] = min(dp[i][j],dp[i+1][k] + dp[k+1][j]);            }        }        printf("Case %d: %d\n",T,dp[0][n-1]);    }    return 0;}


0 0
原创粉丝点击