lighitoj1042:区间DP

lightoj1042

题解

  • dp[i][j]表示第i天到第j天穿的最少的衣服。初始化dp[i][i] = 1(一天必须穿一件),dp[i][j] = inf
  • 如果第i天和第j天穿的是一件衣服,那么dp[i][j] = dp[i][j-1]
  • 剩下的就是区间DP模板。

代码

#include <bits/stdc++.h>
using namespace std;
int const N = 100 + 10;
int const inf = 0x7f7f7f7f;
int a[N],n;
int dp[N][N];
int main(){
	int T,caser = 0;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=n;i>=1;i--){   //从后往前
			dp[i][i] = 1;;
			for(int j=i+1;j<=n;j++){
				dp[i][j] = inf;
				if(a[i] == a[j])	dp[i][j] = dp[i][j-1];   //第i天和第j天穿的衣服相同
				for(int k=i;k<j;k++)
					dp[i][j] = min(dp[i][j],dp[i][k] + dp[k+1][j]);
			}
		}
		printf("Case %d: %d\n",++caser,dp[1][n]);
	}	
	return 0;
}

 

posted @ 2019-04-12 08:40  月光下の魔术师  阅读(6)  评论(0)    收藏  举报