一、线性动态规划

最长严格上升子序列

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n,ans;
  5. int a[],dp[];
  6. int main()
  7. {
  8. scanf("%d",&n);
  9. for(int i=;i<=n;i++)
  10. scanf("%d",&a[i]);
  11. for(int i=;i<=n;i++)
  12. {
  13. for(int j=;j<i;j++)
  14. {
  15. if(a[j]<a[i])
  16. dp[i]=max(dp[i],dp[j]+);
  17. ans=max(ans,dp[i]);
  18. }
  19. }
  20. printf("%d\n",ans+);
  21. return ;
  22. }

最长严格上升子序列

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=0x3f3f3f3f;
  7. int n,a[],dp[];
  8. int main()
  9. {
  10. scanf("%d",&n);
  11. for(int i=;i<=n;i++)
  12. scanf("%d",&a[i]);
  13. memset(dp,0x3f,sizeof(dp));
  14. for(int i=;i<=n;i++)
  15. {
  16. int p=upper_bound(dp+,dp+n+,a[i])-dp;
  17. if(a[i]!=dp[p-])//严格上升序列
  18. dp[p]=a[i];
  19. }
  20. for(int i=;i<=n+;i++)
  21. {
  22. if(dp[i]==maxn)
  23. {
  24. printf("%d\n",i-);
  25. return ;
  26. }
  27. }
  28. return ;
  29. }

nlogn

变形:打鼹鼠

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. using namespace std;
  5. int maxt,n,m,ans,x[],y[],t[],f[];
  6. int main()
  7. {
  8. int i,j;
  9. scanf("%d%d",&n,&m);
  10. for (i=;i<=m;++i)
  11. scanf("%d%d%d",&t[i],&x[i],&y[i]);
  12. for (i=;i<=m;++i)
  13. {
  14. f[i]=;//f表示到第i只鼹鼠出现时最多可以打到多少只
  15. for (j=i-;j>=;--j)
  16. if (t[i]-t[j]>=abs(x[i]-x[j])+abs(y[i]-y[j]))
  17. //如果时间足够,能从j点移动到当前点
  18. f[i]=max(f[i],f[j]+);
  19. ans=max(ans,f[i]);
  20. }
  21. printf("%d",ans);
  22. }

Luogu打鼹鼠

二、背包

1)01背包

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int f[],w[],v[];
  6. int n,m,t;
  7. int main()
  8. {
  9. scanf("%d",&t);
  10. while(t--)
  11. {
  12. memset(f,,sizeof(f));
  13. scanf("%d%d",&n,&m);
  14. for(int i=;i<=n;i++)
  15. scanf("%d",&v[i]);
  16. for(int i=;i<=n;i++)
  17. scanf("%d",&w[i]);
  18. for(int i=;i<=n;i++)
  19. for(int j=m;j>=w[i];j--)
  20. f[j]=max(f[j],f[j-w[i]]+v[i]);
  21. printf("%d\n",f[m]);
  22. }
  23. return ;
  24. }

01背包

2)完全背包

每件物品数量无限

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int w1,w2,wi,t,k,f[],v[],w[];
  6. int main()
  7. {
  8. scanf("%d",&t);
  9. while(t--)
  10. {
  11. memset(f,0x3f,sizeof(f));
  12. f[]=; //**
  13. scanf("%d%d",&w1,&w2);
  14. wi=w2-w1;
  15. scanf("%d",&k);
  16. for(int i=;i<=k;i++)
  17. scanf("%d%d",&v[i],&w[i]);
  18. for(int i=;i<=k;i++)
  19. for(int j=w[i];j<=wi;j++)
  20. f[j]=min(f[j],f[j-w[i]]+v[i]);
  21. if(f[wi]==0x3f3f3f3f)
  22. printf("This is impossible.\n");
  23. else
  24. printf("The minimum amount of money in the piggy-bank is %d.\n",f[wi]);
  25. }
  26. return ;
  27. }

完全背包

3)多重背包

每个物品数量一定

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int t,mon,k,w[],pri[],f[],cnt[];
  6. int main()
  7. {
  8. scanf("%d",&t);
  9. while(t--)
  10. {
  11. memset(f,,sizeof(f));
  12. scanf("%d%d",&mon,&k);
  13. for(int i=;i<=k;i++)
  14. scanf("%d%d%d",&pri[i],&w[i],&cnt[i]);
  15. for(int i=;i<=k;i++)
  16. {
  17. for(int j=mon;j>=pri[i];j--)
  18. {
  19. for(int h=;h<=cnt[i];h++)
  20. {
  21. if(j-h*pri[i]<)break;
  22. f[j]=max(f[j],f[j-h*pri[i]]+h*w[i]);
  23. }
  24. }
  25. }
  26. printf("%d\n",f[mon]);
  27. }
  28. return ;
  29. }

多重背包

4)混合背包

-1为无限个

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. using namespace std;
  5. int w[],v[],c[],dp[];
  6. int main()
  7. {
  8. int vv,n;
  9. scanf("%d%d",&n,&vv);
  10. for(int i=;i<=n;i++)
  11. scanf("%d%d%d",&w[i],&v[i],&c[i]);
  12. for(int i=;i<=n;i++)
  13. {
  14. if(c[i]==-)
  15. {
  16. for(int j=w[i];j<=vv;j++)
  17. {
  18. dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
  19. }
  20. }
  21. else
  22. {
  23. int x=c[i];
  24. for(int j=;j<=x;j<<=)
  25. {
  26. for(int k=vv;k>=w[i]*j;k--)
  27. {
  28. dp[k]=max(dp[k],dp[k-w[i]*j]+v[i]*j);
  29. }
  30. x-=j;
  31. }
  32. if(x!=)
  33. {
  34. for(int j=vv;j>=x*w[i];j--)
  35. {
  36. dp[j]=max(dp[j],dp[j-x*w[i]]+v[i]*x);
  37. }
  38. }
  39. }
  40. }
  41. printf("%d",dp[vv]);
  42. return ;
  43. }

混合背包

5)二维费用背包

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int f[][];
  4. int main(){
  5. int n,m,x;
  6. cin>>n>>m>>x;
  7. for(int i=;i<=n;i++){
  8. int a,b,c;
  9. cin>>a>>b>>c;
  10. for(int j=m;j>=b;j--) //以下3行是算法的核心
  11. for(int k=x;k>=c;k--)
  12. f[j][k]=max(f[j][k],f[j-b][k-c]+a);
  13. }
  14. cout<<f[m][x];
  15. return ;
  16. }

二维费用

6)有依赖性背包问题

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. struct e
  5. {
  6. int v,p,q,w,f[];
  7. }g[];
  8. int n,m,f[];
  9. int main()
  10. {
  11. scanf("%d%d",&n,&m);
  12. for(int i=;i<=m;i++)
  13. {
  14. scanf("%d%d%d",&g[i].v,&g[i].p,&g[i].q);
  15. g[i].w=g[i].v*g[i].p;
  16. if(g[i].q!=)
  17. g[g[i].q].f[++g[g[i].q].f[]]=i;
  18. }
  19. for(int i=;i<=m;i++)
  20. {
  21. if(g[i].q==)
  22. {
  23. int f1=g[i].f[],f2=g[i].f[];
  24. for(int j=n;j>=g[i].v;j--)
  25. {
  26. if(f1&&j-g[f1].v-g[i].v>=)
  27. f[j]=max(f[j],f[j-g[i].v-g[f1].v]+g[i].w+g[f1].w);
  28. if(f2&&j-g[f2].v-g[i].v>=)
  29. f[j]=max(f[j],f[j-g[i].v-g[f2].v]+g[i].w+g[f2].w);
  30. if(f1&&f2&&j-g[i].v-g[f1].v-g[f2].v>=)
  31. 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);
  32. f[j]=max(f[j],f[j-g[i].v]+g[i].w);
  33.  
  34. }
  35. }
  36. }
  37. printf("%d\n",f[n]);
  38. return ;
  39. }

依赖性背包

7)01背包求方案数

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int f[],n,m,a[];
  5. int main(){
  6. scanf("%d%d",&n,&m);
  7. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  8. f[]=;
  9. for(int i=;i<=n;i++)
  10. for(int j=m;j>=a[i];j--)
  11. f[j]+=f[j-a[i]];
  12. printf("%d",f[m]);
  13. }

01背包求方案数

三、区间型dp

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int w[],f[][],sum[];
  6. int n;
  7. int main() {
  8. scanf("%d",&n);
  9. for(int i=; i<=n; i++) {
  10. scanf("%d",&w[i]);
  11. sum[i]=sum[i-]+w[i];
  12. }
  13. for(int i=; i<=n; i++)
  14. for(int j=i-; j>=; j--) {
  15. f[j][i]=0x3f3f3f3f;
  16. for(int k=j; k<i; k++)
  17. f[j][i]=min(f[j][i],f[j][k]+f[k+][i]+sum[i]-sum[j-]);
  18. }
  19.  
  20. printf("%d\n",f[][n]);
  21. return ;
  22. }

合并果子

四、概率dp

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n;
  5. double dp[][];
  6. int main(){
  7. scanf("%d",&n);n/=;
  8. for(int i=;i<=n;i++)dp[i][]=dp[][i]=1.0;
  9. for(int i=;i<=n;i++)
  10. for(int j=;j<=n;j++)
  11. dp[i][j]=(dp[i-][j]+dp[i][j-])/2.0;
  12. printf("%.4lf\n",dp[n][n]);
  13. return ;
  14. }

搞笑世界杯

五、多维dp

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n,m,x,maxx,s[],qp[],f[][][][];
  5. int main()
  6. {
  7. scanf("%d%d",&n,&m);
  8. for(int i=;i<=n;i++)
  9. scanf("%d",&qp[i]);
  10. for(int i=;i<=m;i++)
  11. {
  12. scanf("%d",&x);
  13. if(x==)s[]++;
  14. if(x==)s[]++;
  15. if(x==)s[]++;
  16. if(x==)s[]++;
  17. }
  18. f[][][][]=qp[];
  19. f[][][][]=qp[];
  20. f[][][][]=qp[];
  21. f[][][][]=qp[];
  22. f[][][][]=qp[];
  23. for(int i=;i<=s[];i++)
  24. for(int j=;j<=s[];j++)
  25. for(int l=;l<=s[];l++)
  26. for(int k=;k<=s[];k++)
  27. {
  28. maxx=;
  29. if(i)maxx=max(maxx,f[i-][j][l][k]);
  30. if(j)maxx=max(maxx,f[i][j-][l][k]);
  31. if(l)maxx=max(maxx,f[i][j][l-][k]);
  32. if(k)maxx=max(maxx,f[i][j][l][k-]);
  33. f[i][j][l][k]=maxx+qp[i+j*+l*+k*+];
  34. }
  35. printf("%d\n",f[s[]][s[]][s[]][s[]]);
  36. return ;
  37. }

乌龟棋

整理的不全,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. 安装配置zabbix代理之zabbix_proxy

    配置Proxy代理 如图所示: zabbix_server端在阿里云上,其代理程序部署在各地机房,代理程序收集所在机房的所有机器监控指标,然后传给server端 环境说明: CentOS releas ...

  2. Windows 修改个性化时间显示

    A goal is a dream with a deadline. Much effort, much prosperity. 我感觉我的时间显示不够人性化.不够个性化 修改注册表 我的系统为Win ...

  3. JMS-activMq与spring进行整合

     对JMS做了一个简要介绍之后,接下来就讲一下Spring整合JMS的具体过程.JMS只是一个标准,真正在使用它的时候我们需要有它的具体实现,这里我们就使用Apache的activeMQ来作为它的实现 ...

  4. HTTP Status 500 - java.lang.NoClassDefFoundError: JspTagException

    HTTP Status 500 - java.lang.NoClassDefFoundError: JspTagException cause  java.lang.NoClassDefFoundEr ...

  5. LeetCode第[15]题(Java):3Sum (三数之和为目标值)——Medium

    题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c  ...

  6. Django开发点菜系统学习笔记

    1.使用django-simple-captcha包的时候,会调用到: register_form = RegisterForm(request.POST) 但是这个时候captcha不进行错误检验, ...

  7. maven setting仓库镜像

    国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. 最新更新:2016年11月11日 18:05:40 阿里云提供Maven私服,我把配置文件贴一下,自 ...

  8. 【转】安装OS X虚拟机错误vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123

    新建一个虚拟机, 选择客户机操作系统为Apple MacOS X 10.10, 其余参数可以默认. 注意建好之后不要急着打开客户机, 因为直接打开你会发现新建的客户机将会无法启动. 仔细阅读Mac O ...

  9. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  10. opencv:基本图形绘制

    可以使用opencv绘制 直线.圆.方形.椭圆等基本图形. 示例代码: #include <opencv.hpp> using namespace cv; int main() { // ...