SDUT_经典线型DP
1001 即hdu 1003 Max Sum
状态转移方程 dp[i]=max(dp[i],dp[i-1]);没这么写
是相邻最大和的题,以前做过的题,数组开小了,wa了4次,最后才发现,弱暴了
#include<stdio.h>int num[100005];int main(){ int T,cas=1; scanf("%d",&T);while(cas<=T) {if(cas!=1) printf("\n");int n; scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&num[i]);int sum=0,max=-99999,s=1,e=1,pos=1;for(int i=1;i<=n;i++) { if(sum<0) {sum=num[i];pos=i;}else sum+=num[i]; if(max<sum) { s=pos; max=sum; e=i; } } printf("Case %d:\n%d %d %d\n",cas++,max,s,e); }return 0;}
1002 即hdu 1081 To The Max
1001 这道题的变形,变成2维的了,自己写了个还是wa,还是没学好啊,百度下发现,思考不全面
先是1--n行枚举+一维的dp
#include<stdio.h>#include<string.h>int num[105][105],ss[105];int main(){int n;while(~scanf("%d",&n)) {for(int i=0;i<n;i++)for(int j=0;j<n;j++) { scanf("%d",&num[i][j]); }int max=-99999;for(int i=0;i<n;i++) { memset(ss,0,sizeof(ss));for(int j=i;j<n;j++) {int t=0;for(int k=0;k<n;k++) { ss[k]+=num[j][k];if(t<=0) t=ss[k];else t+=ss[k];if(t>max) max=t; } } } printf("%d\n",max); }return 0;}
1003 hdu 1025 Constructing Roads In JGShining's Kingdom
不知怎么的总是有tle的思路代码,这题呢,经典的lis 题,
#include<stdio.h>#define N 500005int map[N],flag[N];int main(){int n,cas=1;while(~scanf("%d",&n)) {for(int i=1;i<=n;i++) {int a,b; scanf("%d%d",&a,&b); map[a]=b; }int low,hig,mid,top=1; flag[1]=map[1];for(int i=2;i<=n;i++) { low=1;hig=top;while(low<=hig) { mid=(low+hig)/2;if(flag[mid]<map[i]) low=mid+1;else hig=mid-1; } flag[low]=map[i];if(low>top) top++; } printf("Case %d:\n",cas++);if(top==1) printf("My king, at most %d road can be built.\n\n",top);else printf("My king, at most %d roads can be built.\n\n",top); }return 0;}
1004 即hdu1058 Humble Numbers
做过的题了,自己做的思路 感觉定位在 枚举还是比较合适,不合主题~o_o
2 3 5 7 和 前 n-1 个数从大到小枚举
#include<stdio.h>__int64 str[5845];int main(){int n;int b[4]={2,3,5,7}; str[1]=1;for(int i=2;i<=5842;i++) { str[i]=2000000005;for(int j=0;j<4;j++) {for(int k=i-1;k>=1;k--) {if(str[k]*b[j]<=str[i-1]) break;if(str[i]>str[k]*b[j]) str[i]=str[k]*b[j]; } } }while(scanf("%d",&n),n) { printf("The %d",n);if(n%10==1&&n%100!=11) printf("st");else if(n%10==2&&n%100!=12) printf("nd");else if(n%10==3&&n%100!=13) printf("rd");else printf("th"); printf(" humble number is %I64d.\n",str[n]); }return 0;}
1005 即hdu 1080 Human Gene Functions
自己没想出来思路,百度的
先把字符处理成int ,然后就是 dp转移方程
grah[i][j]=max(grah[i-1][j-1]+score[ps[a[i-1]]][ps[b[j-1]]]
,max(grah[i][j-1]+score[4][ps[b[j-1]]],grah[i-1][j]+score[4][ps[a[i-1]]]));
经典啊,我的想法走歪了
#include<iostream>#include<map>#include<string>#include<algorithm>using namespace std;map<char,int > ps; int main(){ ps['A']=0;ps['C']=1;ps['G']=2;ps['T']=3;ps['-']=4;const int score[5][5]= {{5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,-2}, {-1,-2,-2,5,-1}, {-3,-4,-2,-1,0}};int n;cin>>n;while(n--) {string a,b;int lena,lenb; cin>>lena>>a>>lenb>>b;int grah[105][105]; grah[0][0]=0;for(int i=1;i<=lena;i++) grah[i][0]=grah[i-1][0]+score[ps[a[i-1]]][4];for(int i=1;i<=lenb;i++) grah[0][i]=grah[0][i-1]+score[4][ps[b[i-1]]]; for(int i=1;i<=lena;i++)for(int j=1;j<=lenb;j++) { grah[i][j]=max(grah[i-1][j-1]+score[ps[a[i-1]]][ps[b[j-1]]] ,max(grah[i][j-1]+score[4][ps[b[j-1]]],grah[i-1][j]+score[4][ps[a[i-1]]])); } cout<<grah[lena][lenb]<<endl; }return 0;}
转载于:https://www.cnblogs.com/skyming/archive/2011/12/02/2272693.html
SDUT_经典线型DP相关推荐
- hdu 2196(经典树形dp)
题意:给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 解题思路:这道题网上说是经典的树形dp,不过确实很巧妙.两次dfs应该是比较好想到的,因为某节点最大的距离要么就是一直走到叶子节点, ...
- USACO / A Game (经典区间DP)
A Game游戏 IOI'96 - Day 1 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的两端取数,取数后该数 ...
- 石子合并——最经典的dp问题
石子合并三大题型 任意两堆石子合并,直接手写一个小根堆,每次取前面两个相加,得到的值继续放入优先队列中,直到里面只有一个元素就输出 只能合并相邻两堆石子,这就类似于矩阵连乘(传送门),不过还是有一些差 ...
- HDU 3534 Tree (经典树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题意: 给你一棵树,问你有多少对点的距离等于树的直径. 思路: dp[i][0]表示在i的子树中 ...
- poj 2152 Fire - 经典树形dp
题目链接: http://poj.org/problem?id=2152 不多说.. 2006 陈启峰消防站解题报告 这dp简直是神了.. #include <cstdio> #inclu ...
- LeetCode 1000. 合并石头的最低成本(经典区间DP)
1000. 合并石头的最低成本 定义dp[i][j]为尽可能多的合并区间[i, j] 所需的成本,不一定能合并成一堆,但合并完成后剩下的堆数一定小于k,更具体地,剩余的堆数一定是(n - 1) % ( ...
- LintCode 92: Backpack (经典背包DP题)
Backpack 中文English Given n items with size Ai, an integer m denotes the size of a backpack. How full ...
- Leetcode 312. 戳气球(经典区间dp)
为了避免边界问题,我们重新开一个数组,在两个端点加入哨兵1.此时数组下标为0到n+1 状态的定义如下,f[i][j] 表示将区间[i+1,j-1]的气球全部戳爆的最大收益. 我们要求的答案就是f[0] ...
- 算法讲解 -- 区间dp经典模型与优化(石子归并)
石子合并问题是最经典的DP问题.首先它有如下3种题型: PPT讲解:点击打开链接 (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数 ...
- HDU 1500(经典的恶心DP)
这是比较经典的DP 有一点很明显 却很难肯定的 那就是在最好的分组方案中,每组中两根较短的筷子在有序筷子数列中一定是相邻的 dp[j][i]表示从前i根筷子中挑出j组(不考虑第三根) dp[j][i ...
最新文章
- Go 知识点(11) — goroutine 泄露、设置子协程退出条件
- android原理揭秘系列之VacantCell缓存
- 【MaxCompute】学习笔记操作表sql
- 最好的oracle笔记,Oracle学习笔记(一)
- 怎样进入服务器修改东西,进入服务器修改数据库
- php命令执行无法重定向输出,php – CodeIgniter 3重定向功能无法正常工作
- 工程师总结:单片机C语言编程心得
- Zabbix-3.0.0 安装Graphtree
- Android adb命令选择设备操作
- 下一较大值(一,二)
- [转].net cookie版购物车
- 2018修复激活闪退_IOS越狱后和平精英闪退、黑屏、10min封号的解决办法!
- mysql 修改多表数据库_mysql数据库:mysql增删改、单表、多表及子查询
- 快速排序的python实现
- 递归 非递归 遍历二叉树
- 遥感原理与应用总结——第一章:遥感原理的基本概念
- 自然语言处理(NLP):命名实体识别-NER
- vue 带节假日考勤状态的日历
- 基于遗传算法的柔性车间调度优化研究附Matlab代码
- 星期几—YYYY-MM-DD,表示一个日期,你知道是星期几吗?
热门文章
- python plot 增加标记线_Python可视化| matplotlib04-掌握标记和线型的使用,一文,marker,linestyle...
- 解决:Maven resources compiler: Maven project configuration required for module ‘c,不识别Maven项目
- Debug日志正常,输出和HTML页面乱码
- SpringMVC的RESTful(一)
- float.valueof()自动截取有效位数
- java 泛型的类型擦除和桥方法
- CentOS 配置防火墙操作实例(启、停、开、闭port)
- javasript深度拷贝
- Android判断App是否在前台运行
- The most impressed error