您的位置:首页 > 其它

LightOJ 1422 Halloween Costumes 区间DP

2016-07-30 15:00 477 查看
题意:给你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 1000000007

int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: