LightOJ 1422:Halloween Costumes(区间DP入门)
2024-10-21 09:39:30
http://lightoj.com/volume_showproblem.php?problem=1422
题意:去参加派对,有n场派对,每场派对要穿第wi种衣服,可以选择外面套一件,也可以选择脱掉。问至少需要穿多少次衣服。
思路:开始学一下区间DP。学习资料
区间dp就是枚举区间的长度,然后在起点i到起点+长度j这段区间里面,用一个分割线分隔开,分为左右两边,然后通过左右两边的子问题去更新当前枚举的区间的结果。复杂度一般都为O(n^3)。
这里的题目就是一开始dp[i][i] = 1,代表初始的第i个派对需要穿1件衣服。
dp[i][j] = dp[i][k] + dp[k+1][j]。如果 wi == wj 的话,那么代表在起点穿该件衣服,终点可以脱掉之前的衣服用之前的衣服。所以答案需要-1。
#include <bits/stdc++.h>
using namespace std;
#define N 105
#define INF 0x3f3f3f3f
int w[N], dp[N][N];
int main() {
int t, cas = ;
scanf("%d", &t);
while(t--) {
int n;
scanf("%d", &n);
memset(dp, INF, sizeof(dp));
for(int i = ; i <= n; i++) scanf("%d", &w[i]), dp[i][i] = ;
for(int len = ; len < n; len++) {
for(int i = ; i + len <= n; i++) {
int j = i + len;
for(int k = i; k < j; k++)
if(dp[i][j] > dp[i][k] + dp[k+][j]) dp[i][j] = dp[i][k] + dp[k+][j];
if(w[i] == w[j]) dp[i][j]--;
}
}
printf("Case %d: %d\n", ++cas, dp[][n]);
}
return ;
}
最新文章
- 使用CTex完成北京科技大学本科生毕业设计
- 【C++】运算符重载
- SVM 支持向量机
- shell中的双引号,单引号,反引号
- C语言中可变参数的用法
- Android SDK代理服务器解决国内不能更新下载问题(转)
- Android之PendingIntent的深入理解
- pyrhon多进程操作初探
- helm 持久化部署ingres
- Linux 内核参数 arp_ignore &; arp_announce 详解
- 搭建 RabbitMQ Server 高可用集群【转】
- RMQ(Range MinimumQuery)问题之ST算法
- Android中的EventBus
- root密码重置(Centos 7)
- Mysql安装错误:Install/Remove of the Service Denied!解决办法
- 简单的user-based协同过滤算法示例代码
- 超强、超详细Redis入门教程【转】
- Notes of Daily Scrum Meeting(11.12)
- H5商城,纯前端静态页面
- Algorithm——无重复字符的最长子串