codeforces好题记录——4D
来源:互联网 发布:最新微信家校通源码 编辑:程序博客网 时间:2024/05/22 08:17
题目见http://codeforces.com/problemset/problem/4/D
这道题是LIS(longgest increasing string)的一个变种版本。对于LIS问题,我倒是很快能写出答案,但是如果加上一些限制条件,写起来就有点难度了。
我们常用的做法是简单的dp,时间复杂度是O(n^2),如果想要达到O(nlogn),就要在选择最大长度上做一些优化。如下:
//返回b中刚刚大于num的元素的下标*****************************重要
int binarySearch(int num , int k )
{
int low = 0, high = k;
while (low <= high)
{
int mid = (low + high)/2;
if( num >= b[mid])
low = mid + 1;
else
high = mid - 1;
}
return low;
}
//非递归解,时间复杂度为O(nlgn)
//增加一个数组M[13],M[i]表示最长长度为i + 1的increasing subsequence的最后一个元素的最小值
int LIS2()
{
int k = 1;
b[0] = a[0];
for( int i = 1; i < 13; i++)
{
if(a[i] >= b[k])
b[++k] = a[i];
else
{
int pos = binarySearch(a[i], k);
b[pos] = a[i];
}
}
return k;
}
这道题先对一个维度排序,这都可以想到。然后对另一个维度进行dp,注意一些限制条件,比如长宽都要大于卡片大小。用一个数组pre记录序列前一个元素的下标。
然后倒序输出pre的记录。还是要多练啊!dp太不熟了,知道了方法写出的代码还是非常烦,甚至time limited exceed,功力不够!
0 0
- codeforces好题记录——4D
- codeforces好题记录——3D
- codeforces好题记录——2B
- Codeforces Round #430 (Div. 2) C+D补题记录
- # 刷题记录——9.30
- # 刷题记录——9.29
- java——笔试题记录
- 【4-29做题记录】
- 【5-4做题记录】
- 笔试面试题记录(0x01) —— #define
- leetcode刷题记录——383.ransom Note
- LeetCode 456. 132 Pattern——LeetCode刷题记录
- 面试题记录第一节——(activity、fragment)
- 面试题记录第二节——(service、Broadcast)
- 面试题记录第二节——(Binder)
- 面试题记录第五节——Asynctask
- 面试题记录第七节——(事件分发)
- OI成长之路——做题记录
- codeforces好题记录——2B
- Qt之ignore()和accept()
- 2014ACM集训13级PK赛4-Second-price Auction
- codeforces好题记录——3D
- Makefile 中:= ?= += =的区别
- codeforces好题记录——4D
- 左旋字符串——编程珠玑和STL所想到的
- 位运算的巧妙运用
- 返回连续子序列,使得和最大(变形)
- Android中.9.png图片的使用过程和原理
- 理解同步与异步的概念
- Linux rpm 命令参数使用详解
- 【备忘录】MySQL中插入中文显示“???”的解决办法
- android画经过多点的曲线