Halloween Costumes 区间dp

这里写图片描述这里写图片描述

1.初始化为最坏情况,即区间多长,就用多少件衣服。
2.i是用来枚举起始位置,j枚举终点位置,k代表分割区间的位置。
3.如果从第计算dp[i][j]时,如果第i+1~j中没有一件衣服和第i天一样,
dp[i][j] = dp[i+1][j]+1;
如果有a[i] == a[k]
dp[i][j] = min(dp[i][j],dp[i+1][k-1]+dp[k][j])
代表第i次派对的衣服一直穿到第k次

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf = 205;
int main()
{
    int T,a[205],n,dp[205][205];
    scanf("%d",&T);
    for(int l = 1 ; l <= T ; l++)
    {   
        scanf("%d",&n);
        for(int i = 1 ; i <= n ; i++)
            scanf("%d",&a[i]);

        for(int i = 1 ; i <= n ; i++)
        for(int j = i ; 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+1][k-1]+dp[k][j]); 
                    }
                }   
            } 
        }
        printf("Case %d: %d\n",l,dp[1][n]);
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_40240576/article/details/81545959