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

来源:互联网 发布:node.js 应用场景 编辑:程序博客网 时间:2024/06/06 07:42
题意:
给你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\n",cas++,dp[1][n]);    }    return 0;}



0 0
原创粉丝点击