LightOJ - 1422——(区间DP)

总结

这个题感觉不太好想,每次结果取前两个子区间,B子区间全脱光,所以初始化为0,当时初始化为Inf,一直错,可能出现k+1>j-1情况的,这种是B子区间不存在的情况,为0即可,相当于脱光。算是混过一个区间DP了。

题意:

一个人要去参加n个party,第i场party需要穿a[i]风格的衣服,他为了方便可以衣服外面套衣服,在参加party时可以脱掉外面的衣服露出里面的衣服而适应当场party的风格,脱掉的衣服不能再用,问最少需要穿多少次衣服。

题目链接

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
//typedef long long ll;
//#define ull       unsigned long long
//#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<<flush
#define eps         1e-6
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define pa          pair<int,int>
#define ferma(a,b)  pow(a,b-2)
#define pb          push_back
#define all(x)      x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("cin.txt","r",stdin);
    //  freopen("cout.txt","w",stdout);
#endif
}
const int N=1e2+5;
int dp[N][N];
signed main()
{
   // IOS;
    //file();
    int t;
    scanf("%d",&t);
    for(int q=1;q<=t;++q)
    {
        int n;
        scanf("%d",&n);
        vector<int>a(n+1);
        memset(dp,0);
        for(int i=1;i<=n;++i)
            dp[i][i]=1,scanf("%d",&a[i]);
        for(int len=1;len<n;++len)
        {
            for(int i=1;i+len<=n;++i)
            {
                int j=i+len;
                dp[i][j]=dp[i][j-1]+1;
                for(int k=i;k<j;++k)
                    if(a[k]==a[j])
                        dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j-1]);
            }
        }
        printf("Case %d: %d\n",q,dp[1][n]);
    }
    return 0;
}

上一篇:最短路题目


下一篇:试题 基础练习 完美的代价