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 ...
随机推荐
- ionic之angular1.X缓存问题解决
众所周知ionic的angular1.X解决缓存的问题有: 1.在app.js里面修改:默认是true,设置了缓存 .state('tab.msg-main', { url: '/msg-main', ...
- MySQL——索引优化实战
上篇文章中介绍了索引的基本内容,这篇文章我们继续介绍索引优化实战.在介绍索引优化实战之前,首先要介绍两个与索引相关的重要概念,这两个概念对于索引优化至关重要. 本篇文章用于测试的user表结构: 索引 ...
- Error Fix – Replication subscriber does not exist on the server anymore(删除Replication时报错的解决办法)
Recently one of my client has faced weird situation related to SQL Server Replication. Their main da ...
- sysbench安装、使用、结果解读
sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.目前sysbench代码托管在github上,项目地址:https://github.c ...
- Tomcat 一端口多项目,多端口多项目 server.xml
8080端口下项目的webURL为 http://localhost:8080/HelloWorld_spring/HelloController/helloWorld 8081端口下项目 ...
- C# System.IO.Path
Path的常用方法 函数列表 对一个路径做相应操作,包括文件路径,目录路径,通常会用到Path这个类, 本文列举一些常用的操作. 获取指定路径字符串的目录信息 public static string ...
- 一个汇编的HelloWorld!
花了一下午时间,感觉最坑的是,书写代码的个数和编译器的坑比较多,还各种版本的编译器! 会让人“眼花缭乱”! 主要代码 将文件保存为*.asm include io32.inc .data ;数据 sr ...
- October 24th, 2017 Week 43rd Tuesday
We can't give up trying. The fight was worth it. 我们不能放弃尝试,奋斗是值得的. When doing researches in some cutt ...
- MySQL C API 访问 MySQL 示例
代码: /* Simple C program that connects to MySQL Database server */ #include <mysql.h> #include ...
- SDN 第五次上机作业
1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 s1: s2: s3: s4: 3.抓包分析验证负载均衡 s4-eth1: s4-eth2: s4-eth3