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 ...
随机推荐
- Visual Studio Code必备插件
HTML Snippets: 超级实用且初级的 H5代码片段以及提示 HTMLHint: html代码检测 HTML CSS Support : 让 html 标签上写class 智能提示当前项目所支 ...
- ElementUI制作树形表组件
提要 最近项目中需要用到树形表格来描述部门.区域之间的父子展开关系.但是已经在项目中使用的Vue的成熟组件ElementUI以及iViewUI组件都没有提供相应的树形表格组件,无奈找了其他替代方案也都 ...
- gradle中的compileSdkVersion和buildToolsVersion
CompileSdkVersion:编译版本,就是运行这个项目需要的SDK,即API Level. buildToolsVerson:是构建工具的版本,构建工具包括了打包工具aapt.dx等等. 注意 ...
- PHP正则自动验证传入数据
本文出至:新太潮流网络博客 /** * [is_string_regular_type 正则自动验证传入数据] * @E-mial wuliqiang_aa@163.com * @TIME 2017- ...
- 《SQLSERVER2012实施与管理实战指南》前4章节笔记内容
<SQLSERVER2012实施与管理实战指南>前4章节笔记内容 <SQLSERVER2012实施与管理实战指南>的前面4章是<SQLSERVER企业级平台管理实践> ...
- 阿里云rds实例恢复到本地
摘要: 前提: 1,阿里云数据库备份实例,恢复数据的时候需要将数据恢复到本地数据库,是不能直接恢复到RDS上的. 2,需要在本地服务器上下载一个数据库,尽量和RDS数据库版本保持一致.(我现在用的是5 ...
- 报错:java.net.bindexception: address already in use: jvm_bind:8080
原因:8080端口被占用 这说明80端口(该端口是Tomcat的监听端口)已经被其他程序占用,先用命令提示符 " netstat -ano " 命令显示端口状态,再在结果中找到端口 ...
- 解决:Tomcat 局域网IP地址 访问不了
解决:Tomcat 局域网IP地址 访问不了 2014年10月17日 ⁄ 综合 ⁄ 共 1000字 ⁄ 字号 小 中 大 ⁄ 评论关闭 如果连最基本的localhost:8080都失败的话. 原因就一 ...
- redis之禁用保护模式以及修改监听IP
今天在安装filebeat的时候,出现了关于redis报错的问题,所以来总结一下: 报错信息是: (error) DENIED Redis is running in protected mode b ...
- Dijkstra(最短路求解)
Dijkstra(最短路求解) 模板: #include<iostream> #include<cstdio> #include<cstring> #include ...