1.HDU 1003

求最长连续相加的和。

dp[i]=max(a[i],dp[i-1]+a[i]);

dp[i]表示以 i 结尾的最大值。

再开/个strat去标记从哪里开始。

  1. #include <iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int dp[];
  6. int strat[];
  7. int a[];
  8. int main()
  9. {
  10. int t;
  11. scanf("%d",&t);
  12. int k=;
  13. while(t--)
  14. {
  15. k++;
  16. int n;
  17. scanf("%d",&n);
  18. for(int i=;i<n;i++)
  19. {
  20. scanf("%d",&a[i]);
  21. }
  22. memset(dp,,sizeof dp);
  23. memset(strat,,sizeof dp);
  24. dp[]=a[];
  25. strat[]=;
  26. int max=a[];
  27. int pp=;
  28. for(int i=;i<n;i++)
  29. {
  30. if(a[i]>a[i]+dp[i-])
  31. {
  32. dp[i]=a[i];
  33. strat[i]=i;
  34. }
  35. else
  36. {
  37. dp[i]=dp[i-]+a[i];
  38. strat[i]=strat[i-];
  39. }
  40. if(max<dp[i])
  41. {
  42. max=dp[i];
  43. pp=i;
  44. }
  45.  
  46. }
  47. printf("Case %d:\n",k);
  48. printf("%d %d %d\n",max,strat[pp]+,pp+);
  49. if(t) printf("\n");
  50.  
  51. }
  52. return ;
  53. }

2.hdu 1087

求最长上升序列的和;

dp[i]=max(dp[j])+a[i];   a[j]<a[i];

  1. #include <iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int dp[];
  7. int a[];
  8. int main()
  9. {
  10. int n;
  11. while(~scanf("%d",&n))
  12. {
  13. if(n==)
  14. break;
  15. for(int i=;i<n;i++)
  16. {
  17. scanf("%d",&a[i]);
  18. }
  19. memset(dp,,sizeof dp);
  20. dp[]=a[];
  21. for(int i=;i<n;i++)
  22. {
  23. int MAX=;
  24. for(int j=;j<i;j++)
  25. {
  26.  
  27. if(a[i]>a[j])
  28. {
  29. MAX=max(MAX,dp[j]);
  30. }
  31. }
  32. dp[i]=MAX+a[i];
  33. }
  34. int t=;
  35. for(int i=;i<n;i++)
  36. {
  37. t=max(t,dp[i]);
  38. }
  39. cout<<t<<endl;
  40.  
  41. }
  42. return ;
  43. }

3.HDU 1159  最长公共子序列

dp[i][j]=dp[i-1][j-1]+1   a[i]==b[j]

dp[i][j]=max(dp[i][j-1],dp[i-1][j]);

读入是0 开始。计数的时候 从1开始。

  1. #include <iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int dp[][];
  7. char a[];
  8. char b[];
  9. int main()
  10. {
  11. while(cin>>a>>b)
  12. {
  13. int t1=strlen(a);
  14. int t2=strlen(b);
  15. memset(dp,,sizeof dp);
  16. for(int i=;i<=t1;i++)
  17. for(int j=;j<=t2;j++)
  18. {
  19.  
  20. if(a[i-]==b[j-])
  21. dp[i][j]=dp[i-][j-]+;
  22. else
  23. dp[i][j]=max(dp[i-][j],dp[i][j-]);
  24.  
  25. }
  26. cout<<dp[t1][t2]<<endl;
  27. }
  28.  
  29. return ;
  30. }

4.hdu-1160

最长上升子序列加路径

DP[i]表示i结尾的最长数目;

自己加一个 0 0break 测试一下

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<stdio.h>
  4. #include<string.h>
  5. using namespace std;
  6. struct node
  7. {
  8. int w;
  9. int v;
  10. int no;
  11. }mice[];
  12. bool cmp(node a,node b)
  13. {
  14. if(a.w==b.w)
  15. return a.v<b.v;//最开始这里没有排一直出来5。因为体重一样的速度也在排。但是速度从小到大就不会被记录
  16. return a.w<b.w;
  17. }
  18. int pre[];
  19. int dp[];
  20. int main()
  21. {
  22. int a,b;
  23. int k=;
  24. while(cin>>a>>b)
  25. {
  26. mice[k].w=a;
  27. mice[k].v=b;
  28. mice[k].no=k+;
  29. k++;
  30. }
  31. sort(mice,mice+k,cmp);
  32. memset(pre,-,sizeof pre);
  33. for(int i=;i<k;i++)
  34. {
  35. dp[i]=;
  36. }
  37. int mx=,p=-;
  38. for(int i = ; i < k; i++)
  39. {
  40.  
  41. for(int j = ; j < i; j++)
  42. {
  43. if( mice[j].v > mice[i].v)
  44. {
  45. if(dp[j]+ > dp[i])
  46. {
  47. dp[i] = dp[j]+;
  48. pre[i] = j;
  49. }
  50. }
  51. }
  52.  
  53. if(dp[i]>mx)
  54. {
  55. mx=dp[i];
  56. p=i;
  57. }
  58.  
  59. }
  60. cout<<mx<<endl;
  61. int res[];
  62. int i=;
  63. while(p!=-)
  64. {
  65. res[i++]=mice[p].no;
  66. p=pre[p];
  67. }
  68. i--;
  69. for(;i>=;i--)
  70. cout<<res[i]<<endl;
  71.  
  72. return ;
  73. }

5.hdu-1176

这题详细写了。

  1. dp[0][i]= dp[0][i]+max(dp[0][i+1],dp[1][i+1]);
  2. dp[j][i]=dp[j][i]+max(dp[j-1][i+1],max(dp[j][i+1],dp[j+1][i+1]));
    dp[10][i]= dp[10][i]+max(dp[10][i+1],dp[9][i+1]);
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<stdio.h>
  4. #include<string.h>
  5. using namespace std;
  6. int dp[][];//i表示时间,j表示位子
  7. int main()
  8. {
  9. int n;
  10. int t,p;
  11. while(~scanf("%d",&n)&&n)
  12. {
  13. int mx=;
  14. memset(dp,,sizeof dp);
  15. for(int i=;i<n;i++)
  16. {
  17. scanf("%d%d",&p,&t);
  18. dp[p][t]++;
  19. mx=max(mx,t);
  20. }
  21. for(int i=mx-;i>=;i--)
  22. {
  23. dp[][i]= dp[][i]+max(dp[][i+],dp[][i+]);
  24. for(int j=;j<;j++)
  25. {
  26. dp[j][i]=dp[j][i]+max(dp[j-][i+],max(dp[j][i+],dp[j+][i+]));
  27. }
  28. dp[][i]= dp[][i]+max(dp[][i+],dp[][i+]);
  29. }
  30. cout<<dp[][]<<endl;
  31.  
  32. }
  33. return ;
  34. }

dp 入门的更多相关文章

  1. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  2. xbz分组题B 吉利数字 数位dp入门

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

  3. 【dp入门题】【跟着14练dp吧...囧】

    A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...

  4. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  5. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  6. hdu3555 Bomb 数位DP入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...

  7. 【专章】dp入门

    动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. ***实践是检验真理的唯一标准,看再多文章不如自己动手做几道!!!*** 先 ...

  8. HDU 2084 数塔(简单DP入门)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  10. 树形DP入门详解+题目推荐

    树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...

随机推荐

  1. ZOJ 3987 Numbers(Java枚举)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3987 题意:给出一个数n,现在要将它分为m个数,这m个数相加起来必须等于n ...

  2. Python学习 day01打卡

    1.Python : 是一门解释型 弱类型 高级开发编程语言. 2.第一个Python程序的编写: print ("hell,world") 3.变量:把程序运行过程中的值储存起来 ...

  3. 把一个List拆分为几个大小一样的List

    static void Main(string[] args) { List<String> tarArr = new List<String>(); tarArr.Add(& ...

  4. jsp导入数据库数据写法(模板)

    1.导入表格模板 <%@ page language="java" contentType="text/html; charset=utf-8" page ...

  5. Oracle(限定查询2)

    3.2 对数据进行限定查询 在标准SQL之中定义了许多的运算符. 3.2.1.关系运算符 范例: 范例: 范例: 在使用关系运算符判断字符数据的时候注意大小写的编写问题.因为Oracle是区分大小写的 ...

  6. System.out.println 报错: 只能运行在方法体内哦, 类里面只包含属性和方法哦,注意!

    类里面包含属性和方法 所以, System.out.println,只能放在方法体内运行,不能放在类里.方法外哦

  7. 学习笔记33—graphPad画图集

    1.如何去掉如下图所示的基准线(baseline):   解决办法:鼠标左键双击基准线 --->出现下图对话框,勾选Hide baseline即可. 2.画柱状图时,如何将正常人和病人的信息画在 ...

  8. jquery将表单序列化json对象

    $.fn.serializeObject = function () { var obj = {}; var count = 0; $.each(this.serializeArray(), func ...

  9. Linux修改hostname时/etc/hosts、/etc/sysconfig/network ,hostname,三者的区别和联系

    [root@localhost /]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.l ...

  10. Unity --- MeshRenderer之网格合并

    创建如图所示的对象结构,parent为空对象,然后将下面的代码挂载到parent对象上运行即可. using UnityEngine; using System.Collections; public ...