LightOJ 1422 Halloween Costumes 区间DP

来源:互联网 发布:微信恶搞软件 编辑:程序博客网 时间:2024/06/07 01:20

题意:给你n天分别要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿了,问这n天要准备几件衣服。


dp[i][j]为第i天到第j天要穿的最少衣服,考虑第i天,如果后面的[i+1, j]天的衣服不要管,那么dp[i][j] = dp[i + 1][j] + 1。

然后在区间[i +1, j]里面找到和第i天衣服一样的日子,尝试直到那天都不把i脱掉,

那么就变成dp[i][j] = dp[i + 1][k - 1] + dp[k][j],你可能会发现第i天不见了,其实只要把+两边换一下就好说了,就是第k天的衣服一直穿着。

#include <set>#include <map>#include <stack>#include <queue>#include <deque>#include <cmath>#include <vector>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define L(i) i<<1#define R(i) i<<1|1#define INF  0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-9#define maxn 200010#define MOD 1000000007int n;int a[110];int dp[115][115];int main(){    int t,C = 1;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(dp,0,sizeof(dp));        for(int i = 0; i < n; i++)        {            scanf("%d",&a[i]);            dp[i][i] = 1;        }        for(int i = n-2; i >= 0; 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+1][k]+dp[k+1][j]);            printf("%d %d %d\n",i,j,dp[i][j]);        }        printf("Case %d: %d\n",C++,dp[0][n-1]);    }    return 0;}


0 0
原创粉丝点击