Light oj 1422 Halloween Costumes(区间DP:迭代or记忆化搜索)

2024-04-16 11:08

本文主要是介绍Light oj 1422 Halloween Costumes(区间DP:迭代or记忆化搜索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:1422 - Halloween Costumes

题意:

有n个party要参加,每次参加必须穿固定的衣服(ci),每次参加可以选择穿衣服或者脱衣服,也就是可以用外面的衣服将里面的衣服覆盖,后面需要就脱掉外面的把需要的衣服露出来,给出n次party要穿的衣服编号,求最少花费多少衣服

分析:

区间DP

dp[i][j]表示从第i个party到第j个party所需的最少服装数
if (i == j) return dp[i][j] = 1;  //初始化
状态转移: 
1.dp[i][j] = dp[i][j-1]+1//花费第j件衣服
2.考虑不花费第j件衣服分情况:
在区间[i,j-1]内已经穿上过和第j件一样的衣服了
即找到区间[i,j-1]内的一个k,满足c[k] == c[j]
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j-1]) 

dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j-1]) 这个方程的意思是说,此人在参加完[i,k]的party后没有脱下衣服,

参加k+1个party的时候直接穿上衣服把c[k]覆盖在里面,在j-1个party后脱去其他衣服露出c[k](同时也是c[j])

根据DP的思想,这样的一个局部转移是正确的,故而整体的结果都是正确的,最后的结果就是dp[1][n]

用循环和记忆化都可以写(个人更喜欢记忆化)

关于循环枚举区间左端点为什么逆序插一句,如果正序的话岂不是直接i=1的循环就可以求出dp[1][n]?

所以循环的时候区间左端点逆序,右端点正序

循环写法:

#define mem(a,x) memset(a,x,sizeof(a))
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<map>
#include<stdlib.h>
#include<cctype>
#include<string>
#define Sint(n) scanf("%d",&n)
#define Sll(n) scanf("%I64d",&n)
#define Schar(n) scanf("%c",&n)
#define Sint2(x,y) scanf("%d %d",&x,&y)
#define Sll2(x,y) scanf("%I64d %I64d",&x,&y)
#define Pint(x) printf("%d",x)
#define Pllc(x,c) printf("%I64d%c",x,c)
#define Pintc(x,c) printf("%d%c",x,c)
using namespace std;
typedef long long ll;
/*dp[i][j]表示从第i个party到第j个party所需的最少服装数if (i == j) return dp[i][j] = 1;  //初始化状态转移: 1.dp[i][j] = dp[i+1][j] + 1 //花费第i件衣服2.考虑不花费第i件衣服的情况:一定是因为在[i+1,j]区间内已经穿上过和第i件一样的衣服了找到区间[i+1,j]内的一个k,满足 c[k] == c[i] dp[i][j] = min(dp[i][j],dp[i+1][k-1]+dp[k][j]) 或者这样看 1.dp[i][j] = dp[i][j-1]+1//花费第j件衣服2.考虑不花费第j件衣服分情况:在区间[i,j-1]内已经穿上过和第j件一样的衣服了即找到区间[i,j-1]内的一个k,满足c[k] == c[j]dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j-1]) 
*/
int dp[111][111];
int c[111];
int main()
{int T;Sint(T);int kas = 0;while (T--){int n;Sint(n);mem(dp,0);for (int i = 1;i <= n;++i) {Sint(c[i]);dp[i][i] = 1;}for (int i = n-1;i >= 1;--i){for (int j = i+1;j <= n;++j){dp[i][j] = dp[i][j-1] + 1;for (int k = i;k <= j-1;++k)//在区间[i,j-1]内找 {if (c[k] == c[j]){dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j-1]);}}}}printf("Case %d: %d\n",++kas,dp[1][n]);}return 0;
}

记忆化写法:(记忆化写的看着都舒服^_^)

#define mem(a,x) memset(a,x,sizeof(a))
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<map>
#include<stdlib.h>
#include<cctype>
#include<string>
#define Sint(n) scanf("%d",&n)
#define Sll(n) scanf("%I64d",&n)
#define Schar(n) scanf("%c",&n)
#define Sint2(x,y) scanf("%d %d",&x,&y)
#define Sll2(x,y) scanf("%I64d %I64d",&x,&y)
#define Pint(x) printf("%d",x)
#define Pllc(x,c) printf("%I64d%c",x,c)
#define Pintc(x,c) printf("%d%c",x,c)
using namespace std;
typedef long long ll;
/*dp[i][j]表示从第i个party到第j个party所需的最少服装数if (i == j) return dp[i][j] = 1;  //初始化状态转移: 1.dp[i][j] = dp[i+1][j] + 1 //花费第i件衣服2.考虑不花费第i件衣服的情况:一定是因为在[i+1,j]区间内已经穿上过和第i件一样的衣服了找到区间[i+1,j]内的一个k,满足 c[k] == c[i] dp[i][j] = min(dp[i][j],dp[i+1][k-1]+dp[k][j]) 或者这样看 1.dp[i][j] = dp[i][j-1]+1//花费第j件衣服2.考虑不花费第j件衣服分情况:在区间[i,j-1]内已经穿上过和第j件一样的衣服了即找到区间[i,j-1]内的一个k,满足c[k] == c[j]dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j-1]) 
*/
int dp[111][111];
int c[111];
int DP(int i,int j)
{if (~dp[i][j]) return dp[i][j];if (i==j) return dp[i][j] = 1;if (i > j) return 0;dp[i][j] = DP(i,j-1)+1; for (int k = i;k <= j-1;++k){if (c[k] == c[j]) dp[i][j] = min(dp[i][j],DP(i,k)+DP(k+1,j-1));}return dp[i][j];
}
int main()
{int T;Sint(T);int kas = 0;while (T--){int n;Sint(n);mem(dp,-1);for (int i = 1;i <= n;++i) Sint(c[i]);printf("Case %d: %d\n",++kas,DP(1,n));}return 0;
}


这篇关于Light oj 1422 Halloween Costumes(区间DP:迭代or记忆化搜索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908629

相关文章

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

STL迭代器的基础应用

STL迭代器的应用 迭代器的定义方法: 类型作用定义方式正向迭代器正序遍历STL容器容器类名::iterator 迭代器名常量正向迭代器以只读方式正序遍历STL容器容器类名::const_iterator 迭代器名反向迭代器逆序遍历STL容器容器类名::reverse_iterator 迭代器名常量反向迭代器以只读方式逆序遍历STL容器容器类名::const_reverse_iterato

【智能优化算法改进策略之局部搜索算子(五)—自适应Rosenbrock坐标轮换法】

1、原理介绍 作为一种有效的直接搜索技术,Rosenbrock坐标轮换法[1,2]是根据Rosenbrock著名的“香蕉函数”的特点量身定制的,该函数的最小值位于曲线狭窄的山谷中。此外,该方法是一种典型的基于自适应搜索方向集的无导数局部搜索技术。此法于1960年由Rosenbrock提出,它与Hooke-Jeeves模式搜索法有些类似,但比模式搜索更为有效。每次迭代运算分为两部分[3]: 1)

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目(leecode T538): 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 方法:本题

智能优化算法改进策略之局部搜索算子(六)--进化梯度搜索

1、原理介绍     进化梯度搜索(Evolutionary Gradient Search, EGS)[1]是兼顾进化计算与梯度搜索的一种混合算法,具有较强的局部搜索能力。在每次迭代过程中,EGS方法首先用受进化启发的形式估计梯度方向,然后以最陡下降的方式执行实际的迭代步骤,其中还包括步长的自适应,这一过程的总体方案如下图所示:     文献[1]