LightOJ1283 Shelving Books(DP)
题目
Source
http://www.lightoj.com/volume_showproblem.php?problem=1283
Description
You are a librarian. You keep the books in a well organized form such that it becomes simpler for you to find a book and even they look better in the shelves.
One day you get n new books from one of the library sponsors. And unfortunately they are coming to visit the library, and of course they want to see their books in the shelves. So, you don't have enough time to shelve them all in the shelf in an organized manner since the heights of the books may not be same. But it's the question of your reputation, that's why you have planned to shelve them using the following idea:
1) You will take one book from the n books from left.
2) You have exactly one shelf to organize these books, so you may either put this book in the left side of the shelf, right side of the shelf or you may not put it in the shelf. There can already be books in the left or right side. In such case, you put the book with that book, but you don't move the book you put previously.
3) Your target is to put the books in the shelf such that from left to right they are sorted in non-descending order.
4) Your target is to put as many books in the shelf as you can.
You can assume that the shelf is wide enough to contain all the books. For example, you have 5 books and the heights of the books are 3 9 1 5 8 (from left). In the shelf you can put at most 4 books. You can shelve 3 5 8 9, because at first you got the book with height 3, you stored it in the left side of the shelf, then you got 9 and you put it in the right side of the shelf, then you got 1 and you ignored it, you got 5 you put it in the left with 3. Then you got 5 and you put it in left or right. You can also shelve 1 5 8 9 maintaining the restrictions.
Now given the heights of the books, your task is to find the maximum number of books you can shelve maintaining the above restrictions.
Input
Input starts with an integer T (≤ 200), denoting the number of test cases.
Each case starts with a line containing an integer n (1 ≤ n ≤ 100). Next line contains n space separated integers from [1, 105]. The ith integer denotes the height of the ith book from left.
Output
For each case, print the case number and the maximum number of books that can be shelved.
Sample Input
2
5
3 9 1 5 8
8
121 710 312 611 599 400 689 611
Sample Output
Case 1: 4
Case 2: 6
分析
题目大概说有n本书,要依次把它们放到书架,可以放到书架的左边或者右边挨着已经放好的书的下一个位置,当然也可以选择不放。放好后要保证书的高度从左到右非递减。问最多能放上几本书。
n才100,果断这么表示状态:
- dp[i][j][k]表示放置前i本书,书架的左边最后面的书是第j本且书架右边最前面的书是第k本,最多能放的书数
转移我用我为人人,通过dp[i-1]的状态选择将第i本书放到左边还是右边或者不放来转移并更新dp[i]的状态值。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d[111][111][111];
int main(){
int t,n,a[111];
scanf("%d",&t);
for(int cse=1; cse<=t; ++cse){
scanf("%d",&n);
for(int i=1; i<=n; ++i){
scanf("%d",&a[i]);
}
memset(d,-1,sizeof(d));
d[0][0][0]=0;
for(int i=0; i<n; ++i){
for(int j=0; j<=i; ++j){
for(int k=0; k<=i; ++k){
if(d[i][j][k]==-1) continue;
d[i+1][j][k]=max(d[i+1][j][k],d[i][j][k]);
if(j==0 && k==0){
d[i+1][i+1][0]=1;
d[i+1][0][i+1]=1;
}else if(j==0){
if(a[k]>=a[i+1]) d[i+1][i+1][k]=max(d[i+1][i+1][k],d[i][j][k]+1);
if(a[k]>=a[i+1]) d[i+1][j][i+1]=max(d[i+1][j][i+1],d[i][j][k]+1);
}else if(k==0){
if(a[i+1]>=a[j]) d[i+1][i+1][k]=max(d[i+1][i+1][k],d[i][j][k]+1);
if(a[i+1]>=a[j]) d[i+1][j][i+1]=max(d[i+1][j][i+1],d[i][j][k]+1);
}else{
if(a[j]<=a[i+1] && a[i+1]<=a[k]){
d[i+1][i+1][k]=max(d[i+1][i+1][k],d[i][j][k]+1);
d[i+1][j][i+1]=max(d[i+1][j][i+1],d[i][j][k]+1);
}
}
}
}
}
int res=0;
for(int i=0; i<=n; ++i){
for(int j=0; j<=n; ++j){
res=max(res,d[n][i][j]);
}
}
printf("Case %d: %d\n",cse,res);
}
return 0;
}
LightOJ1283 Shelving Books(DP)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
随机推荐
- [Android Pro] 网络流量安全测试工具Nogotofail
reference to : http://www.freebuf.com/tools/50324.html 从严重的HeartBleed漏洞到苹果的gotofail 漏洞,再到最近的SSL v3 P ...
- October 9th 2016 Week 41st Sunday
No matter how resourceful you are, you can't fight fate. 人纵有万般能耐,终也敌不过天命. I find that I gradually be ...
- JSoup笔记
- jQuery和JS原生方法对比
- iOS - 线程管理
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- ssh -v root@xxxxx 显示登录的细节
[root@ok .ssh]# ssh -v root@10.100.2.84 OpenSSH_5.3p1, OpenSSL Feb debug1: Reading configuration dat ...
- cutpFTP设置步骤
cutpFTP设置步骤 平常时为了方便两台电脑之间传送数据,我们可以使用cutpftp这个工具实现,而且cutpftp还具有定时传送的功能,非常方便使用.以下是使用该工具的“同步文件夹”功能同步两台电 ...
- MVC4 WEBAPI(一)使用概述
所谓概述,也就是总结一些WEB API常用的使用用法.MVC APIWEB是一个轻量级的服务接口,完全符合RestFul框架设计,每个URL代表一种资源,使用方便,没有WCF那么庞大,但是麻雀虽小五脏 ...
- PHP+MYSQL+AJAX实现每日签到功能
一.web前端及ajax部分 文件index.html <html> <head> <meta http-equiv=Content-Type content=" ...
- hdu 4068 福州赛区网络赛H 排列 ***
拍的太慢了,很不满意 排完序之后,枚举自己和对手状态,若被击败,则再枚举自己下一个策略,直到可以击败对手所有的策略 #include<cstdio> #include<iostrea ...