一、线性动态规划

最长严格上升子序列

#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
int a[],dp[];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
{
if(a[j]<a[i])
dp[i]=max(dp[i],dp[j]+);
ans=max(ans,dp[i]);
}
}
printf("%d\n",ans+);
return ;
}

最长严格上升子序列

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=0x3f3f3f3f;
int n,a[],dp[];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0x3f,sizeof(dp));
for(int i=;i<=n;i++)
{
int p=upper_bound(dp+,dp+n+,a[i])-dp;
if(a[i]!=dp[p-])//严格上升序列
dp[p]=a[i];
}
for(int i=;i<=n+;i++)
{
if(dp[i]==maxn)
{
printf("%d\n",i-);
return ;
}
}
return ;
}

nlogn

变形:打鼹鼠

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int maxt,n,m,ans,x[],y[],t[],f[];
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for (i=;i<=m;++i)
scanf("%d%d%d",&t[i],&x[i],&y[i]);
for (i=;i<=m;++i)
{
f[i]=;//f表示到第i只鼹鼠出现时最多可以打到多少只
for (j=i-;j>=;--j)
if (t[i]-t[j]>=abs(x[i]-x[j])+abs(y[i]-y[j]))
//如果时间足够,能从j点移动到当前点
f[i]=max(f[i],f[j]+);
ans=max(ans,f[i]);
}
printf("%d",ans);
}

Luogu打鼹鼠

二、背包

1)01背包

每个物品只有一个且只有选与不选两种可能

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[],w[],v[];
int n,m,t;
int main()
{
scanf("%d",&t);
while(t--)
{
memset(f,,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&v[i]);
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
for(int i=;i<=n;i++)
for(int j=m;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);
printf("%d\n",f[m]);
}
return ;
}

01背包

2)完全背包

每件物品数量无限

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w1,w2,wi,t,k,f[],v[],w[];
int main()
{
scanf("%d",&t);
while(t--)
{
memset(f,0x3f,sizeof(f));
f[]=; //**
scanf("%d%d",&w1,&w2);
wi=w2-w1;
scanf("%d",&k);
for(int i=;i<=k;i++)
scanf("%d%d",&v[i],&w[i]);
for(int i=;i<=k;i++)
for(int j=w[i];j<=wi;j++)
f[j]=min(f[j],f[j-w[i]]+v[i]);
if(f[wi]==0x3f3f3f3f)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",f[wi]);
}
return ;
}

完全背包

3)多重背包

每个物品数量一定

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,mon,k,w[],pri[],f[],cnt[];
int main()
{
scanf("%d",&t);
while(t--)
{
memset(f,,sizeof(f));
scanf("%d%d",&mon,&k);
for(int i=;i<=k;i++)
scanf("%d%d%d",&pri[i],&w[i],&cnt[i]);
for(int i=;i<=k;i++)
{
for(int j=mon;j>=pri[i];j--)
{
for(int h=;h<=cnt[i];h++)
{
if(j-h*pri[i]<)break;
f[j]=max(f[j],f[j-h*pri[i]]+h*w[i]);
}
}
}
printf("%d\n",f[mon]);
}
return ;
}

多重背包

4)混合背包

-1为无限个

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int w[],v[],c[],dp[];
int main()
{
int vv,n;
scanf("%d%d",&n,&vv);
for(int i=;i<=n;i++)
scanf("%d%d%d",&w[i],&v[i],&c[i]);
for(int i=;i<=n;i++)
{
if(c[i]==-)
{
for(int j=w[i];j<=vv;j++)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
else
{
int x=c[i];
for(int j=;j<=x;j<<=)
{
for(int k=vv;k>=w[i]*j;k--)
{
dp[k]=max(dp[k],dp[k-w[i]*j]+v[i]*j);
}
x-=j;
}
if(x!=)
{
for(int j=vv;j>=x*w[i];j--)
{
dp[j]=max(dp[j],dp[j-x*w[i]]+v[i]*x);
}
}
}
}
printf("%d",dp[vv]);
return ;
}

混合背包

5)二维费用背包

#include<bits/stdc++.h>
using namespace std;
int f[][];
int main(){
int n,m,x;
cin>>n>>m>>x;
for(int i=;i<=n;i++){
int a,b,c;
cin>>a>>b>>c;
for(int j=m;j>=b;j--) //以下3行是算法的核心
for(int k=x;k>=c;k--)
f[j][k]=max(f[j][k],f[j-b][k-c]+a);
}
cout<<f[m][x];
return ;
}

二维费用

6)有依赖性背包问题

#include<iostream>
#include<cstdio>
using namespace std;
struct e
{
int v,p,q,w,f[];
}g[];
int n,m,f[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&g[i].v,&g[i].p,&g[i].q);
g[i].w=g[i].v*g[i].p;
if(g[i].q!=)
g[g[i].q].f[++g[g[i].q].f[]]=i;
}
for(int i=;i<=m;i++)
{
if(g[i].q==)
{
int f1=g[i].f[],f2=g[i].f[];
for(int j=n;j>=g[i].v;j--)
{
if(f1&&j-g[f1].v-g[i].v>=)
f[j]=max(f[j],f[j-g[i].v-g[f1].v]+g[i].w+g[f1].w);
if(f2&&j-g[f2].v-g[i].v>=)
f[j]=max(f[j],f[j-g[i].v-g[f2].v]+g[i].w+g[f2].w);
if(f1&&f2&&j-g[i].v-g[f1].v-g[f2].v>=)
f[j]=max(f[j],f[j-g[i].v-g[f1].v-g[f2].v]+g[i].w+g[f1].w+g[f2].w);
f[j]=max(f[j],f[j-g[i].v]+g[i].w); }
}
}
printf("%d\n",f[n]);
return ;
}

依赖性背包

7)01背包求方案数

#include<iostream>
#include<cstdio>
using namespace std;
int f[],n,m,a[];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
f[]=;
for(int i=;i<=n;i++)
for(int j=m;j>=a[i];j--)
f[j]+=f[j-a[i]];
printf("%d",f[m]);
}

01背包求方案数

三、区间型dp

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w[],f[][],sum[];
int n;
int main() {
scanf("%d",&n);
for(int i=; i<=n; i++) {
scanf("%d",&w[i]);
sum[i]=sum[i-]+w[i];
}
for(int i=; i<=n; i++)
for(int j=i-; j>=; j--) {
f[j][i]=0x3f3f3f3f;
for(int k=j; k<i; k++)
f[j][i]=min(f[j][i],f[j][k]+f[k+][i]+sum[i]-sum[j-]);
} printf("%d\n",f[][n]);
return ;
}

合并果子

四、概率dp

#include<iostream>
#include<cstdio>
using namespace std;
int n;
double dp[][];
int main(){
scanf("%d",&n);n/=;
for(int i=;i<=n;i++)dp[i][]=dp[][i]=1.0;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dp[i][j]=(dp[i-][j]+dp[i][j-])/2.0;
printf("%.4lf\n",dp[n][n]);
return ;
}

搞笑世界杯

五、多维dp

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,x,maxx,s[],qp[],f[][][][];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&qp[i]);
for(int i=;i<=m;i++)
{
scanf("%d",&x);
if(x==)s[]++;
if(x==)s[]++;
if(x==)s[]++;
if(x==)s[]++;
}
f[][][][]=qp[];
f[][][][]=qp[];
f[][][][]=qp[];
f[][][][]=qp[];
f[][][][]=qp[];
for(int i=;i<=s[];i++)
for(int j=;j<=s[];j++)
for(int l=;l<=s[];l++)
for(int k=;k<=s[];k++)
{
maxx=;
if(i)maxx=max(maxx,f[i-][j][l][k]);
if(j)maxx=max(maxx,f[i][j-][l][k]);
if(l)maxx=max(maxx,f[i][j][l-][k]);
if(k)maxx=max(maxx,f[i][j][l][k-]);
f[i][j][l][k]=maxx+qp[i+j*+l*+k*+];
}
printf("%d\n",f[s[]][s[]][s[]][s[]]);
return ;
}

乌龟棋

整理的不全,noip不会考很难的吧。【逃

【经典】Noip动态规划的更多相关文章

  1. [题解+总结]NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  2. NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  3. POJ1088滑雪(记忆化搜索+DFS||经典的动态规划)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 84297   Accepted: 31558 Description M ...

  4. Edit Distance——经典的动态规划问题

    题目描述Edit DistanceGiven two words word1 and word2, find the minimum number of steps required to conve ...

  5. NOIP 2010题解

    唔..NOIP2010比较简单,总体感觉不错. Problem 1: 机器翻译 水题,队列的简单应用. 读入时判断是否在内存中,可以用hash优化.如果不在内存中push进内存,放不下了pop hea ...

  6. hdu 2084 数塔(动态规划)

    本题是一个经典的动态规划题. 直接利用记忆化搜索:见图解 Ac code : #include<stdio.h> #include<string.h> #define max( ...

  7. hdu 1159 Palindrome(回文串) 动态规划

    题意:输入一个字符串,至少插入几个字符可以变成回文串(左右对称的字符串) 分析:f[x][y]代表x与y个字符间至少插入f[x][y]个字符可以变成回文串,可以利用动态规划的思想,求解 状态转化方程: ...

  8. [LeetCode] 动态规划入门题目

    最近接触了动态规划这个厉害的方法,还在慢慢地试着去了解这种思想,因此就在LeetCode上面找了几道比较简单的题目练了练手. 首先,动态规划是什么呢?很多人认为把它称作一种"算法" ...

  9. UVA1627-Team them up!(动态规划)

    Problem UVA1627-Team them up! Total Submissions:3577  Solved:648 Time Limit: 3000 mSec Problem Descr ...

随机推荐

  1. netbeans等宽字体却不支持中文

    一直用netbeans,各方面都很满意,就是这字体十分不爽,如用等宽字体却不支持中文,百度了一下,找到了解决办法,贴出来,给需要的朋友. 01.找到自己java字体目录.我的目录是[C:\Progra ...

  2. java object 转为 json

    JSONObject jsonObject=JSONObject.fromObject(map) 执行到这的时候没有任何反应的原因及解决办法 http://blog.csdn.net/tjcyjd/a ...

  3. 利用war包和Tomcat镜像创建Web镜像

      from hub.c.163.com/library/tomcat:tag #代表以tomcat镜像为基础 MAINTAINER huhuixin 18611551449@163.com #代表所 ...

  4. 关于C/C++中main函数参数的学习

    因为面对对象作业(2018.5.21)的要求,去学习了C/C++中main函数参数的意义,以及一些简单的使用(从命令行指令的接受),不给予赘述.(仅为个人拙见,还望看官指正) 首先,带有参数的main ...

  5. quartz(6)--集群

    Quartz应用能被集群,是水平集群还是垂直集群取决于你自己的需要.集群提供以下好处: · 伸缩性 · 高可用性 · 负载均衡 目前,Quartz只能借助关系数据库和JDBC作业存储支持集群. qua ...

  6. Oracle递归查询与常用分析函数

    最近学习oracle的一些知识,发现自己sql还是很薄弱,需要继续学习,现在总结一下哈. (1)oracle递归查询  start with ... connect by prior ,至于是否向上查 ...

  7. centos7没有安装ifconfig命令的解决方法(转)

    ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifc ...

  8. Ubuntu 16 安装redis客户端

    https://snapcraft.io/redis-desktop-manager sudo snap install redis-desktop-manager 很好用! 支持模糊过滤,两边加星号 ...

  9. python测试函数的使用时间

    1. 使用装饰器来衡量函数执行时间 有一个简单方法,那就是定义一个装饰器来测量函数的执行时间,并输出结果:(代码通用3.x) import time from functools import wra ...

  10. html5 如何打包成apk,将H5封装成android应用APK文件的几种方法

    直接使用编程软件提供的方法: 1.需要下载安装MyEclipse2014,Android SDK,eclipse(需配置Android开发环境) Java和Android环境安装与配置. 2.打开My ...