博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LightOJ 1422 (区间DP)
阅读量:7081 次
发布时间:2019-06-28

本文共 1017 字,大约阅读时间需要 3 分钟。

题目链接

题目大意:按顺序去参加舞会。每个舞会对衣服都有要求。可以连续穿好多件衣服。需要时候就脱下来,但是一旦脱下来,这件衣服就报废了。问最少需要几件衣服。

解题思路

很难想出这题是个区间DP。

DP边界:

dp[i][i]=1。也就是说每个舞会换件衣服。当然这个不是最优的。

对于dp[i][j]:

如果cos[i]=cos[j],dp[i][j]=dp[i][j-1],很明显i的衣服穿在最底,在j的时候就能拿出来再用了。这是第一步优化。

之后枚举中间点k,注意(i<=k<j)。

如果cos[i]=cos[k](这个条件可以去掉),那么k的衣服就是i的衣服了。那么dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

注意这里是dp[i][k],而不是dp[i][k-1]。原因是不算k的ans包含在i~k区间里,而不是i~k-1的区间。

 

#include "cstdio"#include "cstring"#include "iostream"using namespace std;#define maxn 105#define inf 0x3f3f3f3fint cos[105],dp[105][105];int main(){    //freopen("in.txt","r",stdin);    int T,n,no=0;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++) scanf("%d",&cos[i]);        for(int i=1;i<=n;i++) dp[i][i]=1;        for(int p=1;p<=n;p++)        {            for(int i=1;i<=n;i++)            {                int j=i+p;                dp[i][j]=inf;                if(cos[i]==cos[j]) dp[i][j]=dp[i][j-1];                for(int k=i;k

 

转载于:https://www.cnblogs.com/neopenx/p/4050003.html

你可能感兴趣的文章
Java多线程编程实战:模拟大量数据同步
查看>>
告别webpack react 搭建多页面之痛
查看>>
前嗅ForeSpider教程:链接抽取
查看>>
区块链智能合约solidity入门
查看>>
BigDecimal遇到的问题,大伙也说说
查看>>
字符编码
查看>>
weekly 2019-02-15
查看>>
模块融合中的一些思考
查看>>
如何使用视频剪辑软件将qsv格式视频转换为MP4格式
查看>>
304. Range Sum Query 2D - Immutable
查看>>
NATS--NATS Streaming持久化
查看>>
如何编写简单的parser(基础篇)
查看>>
将视觉深度学习模型应用于非视觉领域
查看>>
2019个税,我们每年能省多少钱~
查看>>
Python爬虫之使用MongoDB存储数据
查看>>
python奇遇记:深入理解装饰器
查看>>
web-push实现原理及细节介绍
查看>>
MongoDB 分片配置
查看>>
elasticsearch概念详解
查看>>
matplotlib Basic Usage
查看>>