POJ2533&&1836&&3176
终于写完了POJ的DP专题,然而都是水题233
这次也把题目分了一下,先挑3道特别简单的讲一下
2533
题意:求最长上升子序列。
很简单,用一般的DP或者二分优化都可以过去
这里懒得写一般DP了,其实就是用f[i]表示前i个数中LIS的数量,那么在i之前找一个j,满足a[j]<a[j]并且f[j]最大,然后转移即可
边界条件:f[i]=1
二分的算法我也有所提及
二分CODE
#include<cstdio>
using namespace std;
const int N=1005;
int f[N],top,n,x;
inline char tc(void)
{
	static char fl[100000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
	x=0; char ch=tc();
	while (ch<'0'||ch>'9') ch=tc();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline int find(int x)
{
	int l=1,r=top,res=0;
	while (l<=r)
	{
		int mid=l+r>>1;
		if (f[mid]<x) res=mid,l=mid+1; else r=mid-1;
	}
	return res;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	register int i;
	read(n);
	for (i=1;i<=n;++i)
	{
		read(x);
		if (!top) { f[++top]=x; continue; }
		if (x<f[1]) f[1]=x;
		int now=find(x); top=now+1>top?now+1:top;
		f[now+1]=x;
	}
	printf("%d",top);
	return 0;
}
1836
题意:类似于合唱队形,好吧就是一样的
给出n个人的身高,要求最少要多少人出列就可以使得所有的人都可以看见两边中的任意一边
这里我们先处理出从前往后的LIS和从后往前的LIS,然后枚举一下哪两个人之间的人全部出队即可
CODE
#include<cstdio>
using namespace std;
const int N=1005;
double a[N];
int n,back[N],front[N],ans=0;
inline int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	register int i,j;
	for (scanf("%d",&n),i=1;i<=n;++i)
	scanf("%lf",&a[i]);
	for (back[n]=1,i=n-1;i>=1;--i)
	for (back[i]=1,j=i+1;j<=n;++j)
	if (a[j]<a[i]) back[i]=max(back[i],back[j]+1);
	for (front[1]=1,i=2;i<=n;++i)
	for (front[i]=1,j=1;j<i;++j)
	if (a[j]<a[i]) front[i]=max(front[i],front[j]+1);
	for (i=0;i<=n;++i)
	for (j=i+1;j<=n+1;++j)
	ans=max(ans,front[i]+back[j]);
	printf("%d",n-ans);
	return 0;
}
3176
题意:这道题都没有翻译题意,看看样例就知道是老掉牙的数字金字塔问题了
DP即可,用f[i][j]表示到第i行第j列时最大值是多少,则
f[i+1][j]=max(f[i+1][j],f[i][j]+a[i][j])
f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+a[i][j])
CODE
#include<cstdio>
using namespace std;
const int N=360;
int f[N][N],x,n,ans;
inline char tc(void)
{
	static char fl[100000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
	x=0; char ch=tc();
	while (ch<'0'||ch>'9') ch=tc();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	register int i,j;
	for (read(n),i=1;i<=n;++i)
	for (j=1;j<=i;++j)
	read(x),f[i+1][j]=max(f[i+1][j],f[i][j]+x),f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+x);
	for (j=1;j<=n+1;++j)
	ans=max(ans,f[n+1][j]);
	printf("%d",ans);
	return 0;
}
当然对于这种DP方程以我的尿性肯定是要滚存一下的
滚存CODE
#include<cstdio>
#include<cstring>
using namespace std;
const int N=360;
int f[2][N],x,n,ans;
inline char tc(void)
{
	static char fl[100000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
	x=0; char ch=tc();
	while (ch<'0'||ch>'9') ch=tc();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	register int i,j;
	for (read(n),i=1;i<=n;++i)
	{
		int now=i&1,nxt=now^1;
		memset(f[nxt],0,sizeof(f[nxt]));
		for (j=1;j<=i;++j)
		{
			read(x);
			f[nxt][j]=max(f[nxt][j],f[now][j]+x),f[nxt][j+1]=max(f[nxt][j+1],f[now][j]+x);
		}
	}
	for (j=1;j<=n+1;++j)
	ans=max(ans,f[(n+1)&1][j]);
	printf("%d",ans);
	return 0;
}
												
											POJ2533&&1836&&3176的更多相关文章
- POJ2533——Longest Ordered Subsequence(简单的DP)
		
Longest Ordered Subsequence DescriptionA numeric sequence of ai is ordered if a1 < a2 < ... &l ...
 - poj 1836 Alignment(dp)
		
题目:http://poj.org/problem?id=1836 题意:最长上升子序列问题, 站队,求踢出最少的人数后,使得队列里的人都能看到 左边的无穷远处 或者 右边的无穷远处. 代码O(n^2 ...
 - POJ 1836 Alignment  水DP
		
题目: http://poj.org/problem?id=1836 没读懂题,以为身高不能有相同的,没想到排中间的两个身高是可以相同的.. #include <stdio.h> #inc ...
 - poj 1836 Alignment(线性dp)
		
题目链接:http://poj.org/problem?id=1836 思路分析:假设数组为A[0, 1, …, n],求在数组中最少去掉几个数字,构成的新数组B[0, 1, …, m]满足条件B[0 ...
 - poj 3176 Cow Bowling(区间dp)
		
题目链接:http://poj.org/problem?id=3176 思路分析:基本的DP题目:将每个节点视为一个状态,记为B[i][j], 状态转移方程为 B[i][j] = A[i][j] + ...
 - Mac破解Sublime Text 3 3176
		
## Sublime Text 3 Serial key build is 3176 > * Added these lines into /etc/hosts 127.0.0.1 www.su ...
 - POJ 3176 Cow Bowling(dp)
		
POJ 3176 Cow Bowling 题目简化即为从一个三角形数列的顶端沿对角线走到底端,所取得的和最大值 7 * 3 8 * 8 1 0 * 2 7 4 4 * 4 5 2 6 5 该走法即为最 ...
 - sublime text3 3176激活码
		
sublime text3 3176激活码 改host文件 #sublime 127.0.0.1 license.sublimehq.com 127.0.0.1 45.55.255.55 127. ...
 - 【动态规划+二分查找】POJ2533&POJ1631最长上升子序列(LIS)
		
POJ2533裸的LIS,时间复杂度为O(n^2) #include<iostream> #include<cstdio> using namespace std; +; in ...
 
随机推荐
- android 电话监听和拦截
			
一.首先在manifest.xml文件中获取监听电话权限,注册监听电话的Activity <receiver android:name=".PhoneReceiver"> ...
 - JSP基本语法总结【1】(jsp工作原理,脚本元素,指令元素,动作元素)
			
时隔半年,回头对jsp复习整理一下,温故而知新. jsp工作原理: jsp服务器管理jsp页面分两个阶段:转换阶段(translation phase)和执行阶段(execution phase). ...
 - Charles抓取https请求
			
最近公司将Windows产品的http请求,替换成https请求了,当https请求超过5次失败,就自动切换回http请求.测试时使用Charles抓包测试. 一.http抓包 http抓包比较简单, ...
 - CSS 小结笔记之图标字体(IconFont)
			
本篇主要介绍一种非常好用的图标大法——图标字体(IconFont). 什么是图标字体?顾名思义,它是一种字体,只不过这个字体显示的并不是具体的文字之类的,而是各种图标. 网站上经常会用到各种图标,之前 ...
 - Sofware-Engineering   Zero
			
第一部分:结缘计算机 与大部分同学一样,也是刚刚进入大学才接触编程,在第一堂C语言课上敲下了第一行属于自己的代码""Hello World",然后在摸索中开始自己的Cod ...
 - Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
			
[编者按]本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文. 这是一篇讲述将大块 Pyth ...
 - Linux基础知识与基础命令
			
Linux基础知识与基础命令 系统目录 Linux只有一个根目录,没有盘符的概念,文件目录是一个倒立的树形结构. 常用的目录功能 bin 与程序相关的文件 boot 与系统启动相关 cdrom 与Li ...
 - python selenium爬取自如租房数据保存到TXT文件
			
# -*- coding: utf-8 -*-"""Created on Fri Aug 31 2018 @author: chenlinlab"" ...
 - PowerShell下载文件
			
$webRequest = [System.Net.HttpWebRequest]::Create("http://go.microsoft.com/fwlink/?LinkID=14915 ...
 - October 27th, 2017 Week 43rd Friday
			
The only thing predictable about life is its unpredictability. 人生唯一可以预知的,就是它的变化莫测. Is it really unpr ...