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--listView的divider分割线样式和边距
1.建立一个drawable文件list_divider.xml <?xml version="1.0" encoding="utf-8"?> &l ...
- Oracle EBS GL总账凭证取值
SELECT gh.je_header_id, gh.period_name, gh.default_effective_date, gh.je_source, gs.user_je_source_n ...
- h5页面调用摄像头(简易版)
<input type="button" value="OpenVideo" id="btnOpenVideo" /> < ...
- MySQL优化之Explain命令解读,optimizer_trace
简述: explain为mysql提供语句的执行计划信息.可以应用在select.delete.insert.update和place语句上.explain的执行计划,只是作为语句执行过程的一个参考, ...
- 学习笔记:MySQL Big DELETEs 删除大量数据
原文地址:http://mysql.rjweb.org/doc.php/deletebig Table of Contents The ProblemWhy it is a ProblemInnoDB ...
- AD RMS企业文件版权管理
AD RMS (AD权限管理服务)能够确保企业内部数字文件的机密性,例如,用户即使有权限读取受保护的文件,但是如果未被许可,就无法复制与打印该文件. AD RMS概述 虽然可以通过NTFS权限来设置用 ...
- 【转】MaBatis学习---源码分析MyBatis缓存原理
[原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...
- PHP类继承、接口继承关系概述
PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &quo ...
- if 和 elif 的区别
if: 如果一个判断中用if, 程序他会遍历所有的if, 即使你的判断条件遍历到了, 也会继续执行, 直到遍历完所有的if. elif: 而elif呢, 则效率很高. 只要遍历到你的判断条件, ...
- Gold Point Game~~
黄金点游戏 1. 队友博客链接 GitHub链接 2.过程总结 (1)俩人各自所做工作?对方编程习惯总结(是否遵照代码规范.是否关注算法效率.是否做了代码复审.界面设计是否关注美观实用等等): 这次作 ...