LightOJ1422->区间DP
题意:
给你n天要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿,问这n天最少需要准备多少件衣服
题解:
题目类型:区间DP
dp[i][j]表示区间[i,j]最少需要多少件衣服
(从最小的区间向最大的区间扩展)如果第i件衣服不能重复利用,则:
dp[i][j] = dp[i+1][j] + 1如果在之后的区间[i+1 , j]中第k件衣服恰好和第i件衣服相同, 则:
dp[i][j] = min(dp[i][j] , dp[i][k-1]+dp[k+1][j]) ;
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std ;
#define MAX 120
int dp[MAX][MAX] , cloth[MAX] ;
int main()
{
int T ,n;
cin >> T ;
for(int cas = 1 ; cas <= T ; cas ++)
{
cin >> n ;
for (int i = 1 ; i <= n ; i ++) cin >> cloth[i] ;
memset(dp , 0 , sizeof(dp)) ;
for (int i = 1 ; i <= n ; i ++) dp[i][i] = 1 ;
for (int j = 1; j < n; j++)
{
for(int i = 1 ; i + j <= n ; i ++)
{
dp[i][i+j] = dp[i+1][i+j] + 1 ;
for(int k = i+1 ; k<= i+j ; k ++)
{
if(cloth[k] == cloth[i])
dp[i][i+j] = min(dp[i][i+j] , dp[i][k-1] + dp[k+1][i+j]) ;
}
}
}
printf("Case %d: %d\n", cas , dp[1][n]);
}
return 0 ;
}