caioj 1078 动态规划入门(非常规DP2:不重叠线段)(状态定义问题)
我一开始想的是前i个区间的最大值
显然对于当前的区间,有不选和选两种情况
如果不选的话,就继承f[i-1]
如果选的话,找离当前区间最近的区间取最优
f[i] = max(f[i-1, f[j] + a[i].v()) j为i前面区间中能取得离i最近的区间
那么显然这里涉及到f[i]的时候取的最后一个区间是什么,才能比较
那么就要额外开一个last数组来记录
最后输出f[n]
这样写很麻烦,但是我还是强行写出然后还AC了
#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 1123;
int f[MAXN], last[MAXN], n;
struct node
{
int l, r;
int v() { return r - l + 1; }
bool operator < (const node& rhs) const
{
return r < rhs.r || (r == rhs.r && l < rhs.l);
}
}a[MAXN];
int main()
{
scanf("%d", &n);
REP(i, 1, n + 1) scanf("%d%d", &a[i].l, &a[i].r);
sort(a + 1, a + n + 1);
f[1] = a[1].v();
last[1] = a[1].r;
REP(i, 2, n + 1)
{
if(a[i].v() > f[i-1])
{
f[i] = a[i].v();
last[i] = a[i].r;
}
else
{ f[i] = f[i-1];
last[i] = last[i-1];
}
for(int j = i - 1; j >= 1; j--)
if(last[j] < a[i].l)
{
if(f[i] < f[j] + a[i].v())
{
f[i] = f[j] + a[i].v();
last[i] = a[i].r;
}
break;
}
}
printf("%d\n", f[n]);
return 0;
}
然后我就突然想到
如果我们换一下状态,设f[i]为以i为结尾的区间的最大值,也就是说i区间必须要取
那么这个时候岂不是f[i]的最后一个区间就是a[i],不就可以省去一个last数组了吗
同时答案不是f[n],而是f数组里面的最大值,因为答案不一定以n为结尾。
然后就写了,代码大大简化,爽!
所以有时候还是要想一个合适的状态,可以大大简化程序和思维量
最后其实按照题目可以设置数据n=1,这个时候我的程序会输出0,会错。
但是数据里面没有这个坑……有的话特判一下就好了
#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 1123;
int f[MAXN], n;
struct node
{
int l, r;
int v() { return r - l + 1; }
bool operator < (const node& rhs) const
{
return r < rhs.r || (r == rhs.r && l < rhs.l); //对于这道题而言,按照左端
} //点和右端点排序都是对的
}a[MAXN];
int main()
{
scanf("%d", &n);
REP(i, 1, n + 1) scanf("%d%d", &a[i].l, &a[i].r);
sort(a + 1, a + n + 1);
int ans = 0;
REP(i, 1, n + 1)
{
f[i] = a[i].v(); //这句话不能省,当前区间先取了再说
REP(j, 1, i)
if(a[j].r < a[i].l)
f[i] = max(f[i], f[j] + a[i].v());
ans = max(ans, f[i]);
}
printf("%d\n", ans);
return 0;
}
caioj 1078 动态规划入门(非常规DP2:不重叠线段)(状态定义问题)的更多相关文章
- caioj 1080 动态规划入门(非常规DP4:乘电梯)(dp数组更新其他量)
我一开始是这么想的 注意这道题数组下标是从大到小推,不是一般的从小到大推 f[i]表示从最高层h到第i层所花的最短时间,答案为f[1] 那么显然 f[i] = f[j] + wait(j) + (j ...
- caioj 1086 动态规划入门(非常规DP10:进攻策略)
一开始看到题目感觉很难 然后看到题解感觉这题贼简单,我好像想复杂了 就算出每一行最少的资源(完全背包+二分)然后就枚举就好了. #include<cstdio> #include<a ...
- caioj 1087 动态规划入门(非常规DP11:潜水员)(二维背包)
这道题的难点在于价值可以多. 这道题我一开始用的是前面的状态推现在的状态 实现比较麻烦,因为价值可以多,所以就设最大价值 为题目给的最大价值乘以10 #include<cstdio> #i ...
- 洛谷P1280 && caioj 1085 动态规划入门(非常规DP9:尼克的任务)
这道题我一直按照往常的思路想 f[i]为前i个任务的最大空暇时间 然后想不出来怎么做-- 后来看了题解 发现这里设的状态是时间,不是任务 自己思维还是太局限了,题做得太少. 很多网上题解都反着做,那么 ...
- caioj 1084 动态规划入门(非常规DP8:任务安排)(取消后效性)
这道题的难点在于,前面分组的时间会影响到后面的结果 也就是有后效性,这样是不能用dp的 所以我们要想办法取消后效性 那么,我们就可以把影响加上去,也就是当前这一组加上了s 那么就把s对后面的影响全部加 ...
- caioj 1083 动态规划入门(非常规DP7:零件分组)(LIS)
这道题题目给的顺序不是固定的 所以一开始要自己排序,按照w来排序 后来只要看l就可以了 然后求最长下降子序列即可(根据那个神奇的定理,LIS模板里有提到) #include<cstdio> ...
- caioj 1082 动态规划入门(非常规DP6:火车票)
f[i]表示从起点到第i个车站的最小费用 f[i] = min(f[j] + dist(i, j)), j < i 动规中设置起点为0,其他为正无穷 (貌似不用开long long也可以) #i ...
- caioj 1081 动态规划入门(非常规DP5:观光游览)
这道题和前面的分组的题有点像 就是枚举最后一组的长度. 然后组数可以在第一层循环也可以在第二层循环 我自己的话就统一一下在第一层循环吧 然后这道题题意我一直没理解清楚,浪费了很多时间,写复杂了 同时初 ...
- caioj 1079 动态规划入门(非常规DP3:钓鱼)(动规中的坑)
这道题写了我好久, 交上去90分,就是死活AC不了 后来发现我写的程序有根本性的错误,90分只是数据弱 #include<cstdio> #include<algorithm> ...
随机推荐
- 多任务-进程之Queue的进程间通信
1.经过线程和进程的对比,不难的知道,线程和进程有相当大的区别,如全局变量资源不能够共享. 2.在不同的进程间,如何实现通信呢? 需要提及的一个概念就是Queue,它是一个消息队列,下面通过一个例子来 ...
- django框架-Admin管理站点搭建
在django框架中,admin基本上算是已经写好了的,拿过来进行简单的处理即可以使用的,相对于flask来说已经是相当的便捷了. 在使用中,步骤如下: 1.管理界面本地化:即将英文标题等的变成中文, ...
- [agc015c]nuske vs phantom thnook
题意: 有一个n*m的网格图,每个格子是蓝色或白色.四相邻的两个格子连一条边,保证蓝格子构成一个森林. 有q组询问,每次询问给出一个矩形,问矩形内蓝格子组成的联通块个数. $1\leq n,m\leq ...
- 解决new Date的值为Invalid Date、NaN-NaN的问题
错误代码: let timespan = 1515239514230; let dateTime = new Date(timespan); console.log(dateTime) // 返回 I ...
- POJ-1511 Invitation Cards 往返最短路 邻接表 大量数据下的处理方法
题目链接:https://cn.vjudge.net/problem/POJ-1511 题意 给出一个图 求从节点1到任意节点的往返路程和 思路 没有考虑稀疏图,上手给了一个Dijsktra(按紫书上 ...
- AES对称加密util
package cn.com.qmhd.oto.common; import java.security.Key; import java.security.NoSuchAlgorithmExcept ...
- 队列(Queue)-c实现
相对而言,队列是比较简单的. 代码还有些warning,我改不动,要找gz帮忙. #include <stdio.h> typedef struct node { int data; st ...
- 紫书 例题11-7 UVa 753 (网络流最大流)
设一个源点, 到所有设备连一条弧, 容量为1, 然后设一个汇点, 所有插座到汇点连弧, 容量为1, 然后 转换器也连一条弧, 容量为1. 最后最大流就是答案.其中注意节点数要开大一些. #includ ...
- vue2.0移动端自定义性别选择提示框
这篇文章主要是简单的实现了vue2.0移动端自定义性别选择的功能,很简单但是经常用到,于是写了一个小小的demo,记录下来. 效果图: 实现代码: <template> <div c ...
- 【hdu 1890】Robotic Sort
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1890 [题意] 给你n个数字; i从1到n; 每次让你把第i小的数和数组的第i个元素之间这段区间内 ...