博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0x51 线性DP
阅读量:4995 次
发布时间:2019-06-12

本文共 3032 字,大约阅读时间需要 10 分钟。

数据结构没什么好写的。。分块和整体二分还有点分学得很懂。。果然我还是比较适合这些东西

poj2279 奇怪题,我的想法就是五维记录最边上的一斜排,会M,结果的的确确是锻炼思维的,正解并不是DP2333

LCIS 这个。。。其实还挺常规的吧(脑子一抽),f[i][j]表示第一个匹配到i第二个匹配到j且选了j。

 

#include
#include
#include
#include
#include
#include
using namespace std;int a[3100],b[3100],f[3100][3100];int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++)scanf("%d",&b[i]); for(int i=1;i<=n;i++) { int mx=0; for(int j=1;j<=n;j++) { if(a[i]!=b[j])f[i][j]=f[i-1][j]; else f[i][j]=mx+1; if(b[j]
LCIS

 

poj3666 首先要证明的是一定存在一种构造b的方案令所有b值都在a中出现过(我就不证了),f[i][j]表示枚举到i,且当前等于a数组中排名为j的那个数的最小值,和上题一样可以省掉一个for(也是常规操作吧)

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;int n,m; LL a[2100],ls[2100];void LSH(){ m=0; for(int i=1;i<=n;i++)ls[++m]=a[i]; sort(ls+1,ls+m+1); m=unique(ls+1,ls+m+1)-ls-1; for(int i=1;i<=n;i++) a[i]=lower_bound(ls+1,ls+m+1,a[i])-ls;}LL ans;LL f[2100][2100];LL myabs(LL x){ return x>0?x:-x;}void DP1(){ memset(f,63,sizeof(f)); for(int j=1;j<=n;j++)f[1][j]=myabs(ls[a[1]]-ls[j]); for(int i=2;i<=n;i++) { LL mn=(1LL<<62); for(int j=1;j<=m;j++) { mn=min(mn,f[i-1][j]); f[i][j]=mn+myabs(ls[a[i]]-ls[j]); } } for(int j=1;j<=n;j++)ans=min(ans,f[n][j]);}void DP2(){ memset(f,63,sizeof(f)); for(int j=1;j<=n;j++)f[1][j]=myabs(ls[a[1]]-ls[j]); for(int i=2;i<=n;i++) { LL mn=(1LL<<62); for(int j=m;j>=1;j--) { mn=min(mn,f[i-1][j]); f[i][j]=mn+myabs(ls[a[i]]-ls[j]); } } for(int j=1;j<=n;j++)ans=min(ans,f[n][j]);}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); LSH(); ans=(1LL<<62); DP1();DP2(); printf("%lld\n",ans); return 0;}
poj3666

Mobile Service 这个省维的思想还挺好的,因为要修第i-1个位置,那么当要修第i个位置的时候肯定有个人在p[i-1]省去一维

#include
#include
#include
#include
#include
#include
using namespace std;int mp[210][210],p[1100];int f[1100][210][210];int main(){ int n,Q; scanf("%d%d",&n,&Q); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&mp[i][j]); p[0]=1; for(int i=1;i<=Q;i++)scanf("%d",&p[i]); memset(f,63,sizeof(f));f[0][2][3]=f[0][3][2]=0; for(int i=0;i
Mobile Service

传纸条 表示我一眼插头DP 然而就是大力DP就好,只用三维,因为只能下或右走那么当前两条线的位置肯定是在一条右往左的斜线上,也就是x1+y1=x2+y2

#include
#include
#include
#include
#include
#include
using namespace std;int a[60][60];int f[110][60][60];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); memset(f,0,sizeof(f));f[1][2][1]=a[1][2]+a[2][1]; for(int i=1;i
传纸条

I-country 超麻烦,需要考虑行数,左右边界,当前权,当前左右区间分别是上升还是下降

 

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/9455380.html

你可能感兴趣的文章
Socket 学习(三)
查看>>
题解 CF43B 【Letter】
查看>>
CommandName and CommandArgument
查看>>
[z]FNV哈希算法
查看>>
通过层序和中序遍历序列重建二叉树
查看>>
【Git】git clone与git pull区别
查看>>
【SVN】SVN的trunk、branches、tag的使用以及分支的概念
查看>>
JS闭包理解
查看>>
整数对题目
查看>>
php设计模式-观察者模式
查看>>
NFC技术:使用Android Beam技术传输文本(一)
查看>>
C++判断一个文件是否可以正确打开的代码
查看>>
unity 判断 是手机还是平板
查看>>
VisualStudio2015单步调试
查看>>
【进程资源】监视进程资源
查看>>
团队成员效绩评定
查看>>
【數據結構】哈工大實驗一:一元多项式(代碼以及報告)
查看>>
简单理解Socket
查看>>
Hortonworks HDP Sandbox定制(配置)开机启动服务(组件)
查看>>
DHCP Option 60 认识
查看>>