一、线性动态规划

最长严格上升子序列

#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. ubuntu 刚更改默认python3版本后更新包等

    一般来说ubuntu 刚更改为python3为默认版本后要进行一下更新包等等的内容(当然不更新一下也是可以的,最好更新一下,第一次更新较慢) 使用下面两行代码: sudo apt-get update ...

  2. oracle 中 dual 详解

    基本上oracle引入dual为的就是符合语法1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的.2. Oracle中的dual表是一 ...

  3. Centos6.5安装python2.7与pip

    安装Python2.7 安装环境 [root@localhost1 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@local ...

  4. Madplay移植到mini2440开发板【转】

    本文转载自:https://blog.csdn.net/simanstar/article/details/24035379 madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1 ...

  5. Java JDBC概要总结一(基本操作和SQL注入问题)

    JDBC定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系 ...

  6. spring security采用基于持久化 token 的方法实现的remember me功能

    采用该方法相较于简单加密方式安全一些.具体的原理见 http://wiki.jikexueyuan.com/project/spring-security/remember-me.html  一.建立 ...

  7. 关于Node.js的__dirname,__filename,process.cwd(),./文件路径的一些坑

    探索 计算机不会欺骗人,一切按照规则执行,说找不到这个文件,那肯定就是真的找不到,至于为什么找不到,那就是因为我们理解有偏差,我最初理解的'./'是当前执行js文件所在的文件夹的绝对路径,然后Node ...

  8. Permutations,全排列

    问题描述:给定一个数组,数字中数字不重复,求所有全排列. 算法分析:可以用交换递归法,也可以用插入法. 递归法:例如,123,先把1和1交换,然后递归全排列2和3,然后再把1和1换回来.1和2交换,全 ...

  9. Java 各种锁的小结

    一. synchronized 在 JDK 1.6 之前,synchronized 是重量级锁,效率低下. 从 JDK 1.6 开始,synchronized 做了很多优化,如偏向锁.轻量级锁.自旋锁 ...

  10. vue组件化开发-vuex状态管理库

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 ...