lightoj 1422【区间DP·分类区间首元素的情况】

题意:
给你n天分别要穿的衣服种类,可以套着穿,
一旦脱下来就不能再穿,求n天至少要几件。

思路:
区间DP
dp[i][j]代表i到j需要至少几件衣服
第i天的衣服在第i天穿上了,dp[i][j]=dp[i+1][j]+1,

枚举区间(i,j],如果有第k天的衣服=第i天的,考虑第i件衣服在在第i天没穿(因为穿上了,第k天还需要穿么?)dp[i][j]=dp[i+1,k-1]+dp[k,j];

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f;
const int N=1e2+10;
int n,a[N];
int dp[N][N];

int main()
{
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);

        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            dp[i][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
",cas++,dp[1][n]);
    }
    return 0;
}





原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777489.html