dp打开思路4:POJ1189 UVA12511 HDU2845 HBCPC K

POJ1189

http://poj.org/problem?id=1189

怎么说呢,不算难,但是容易出问题

我一开始的思路是,第一个钉子只有一种情况,然后下面每个钉子:左边有钉子就加左边的情况数,右边有钉子就加右边的情况数,上边没钉子就加就加上上面的情况。(加情况均是因为小球可以到这里)

我们想到的就是概率问题,这样用情况数量做的话,情况数量统计的确实没错,我想最后把某个位置情况除以总情况就好了,其实是不行的,因为每种情况发生的概率是不一样的,这就是我失败的原因。

后来想到其他方法:假设开始就有n个球,然后每次遇到钉子就分散,也就是数量减少一半,其他一样,也就是说左右有钉子都只加上数量的一半,这就解决了概率问题。

dp可以“人人为我”或者“我为人人”,这种思路明显是人人为我,如果是我为人人推的话,会更加简洁,对于每个钉子,

1、下面有钉子的时候:dp[i+1][j]+=dp[i][j]/2,dp[i+1][j+1]+=dp[i][j]/2,

2、下面没钉子时:dp[i+2][j+1]+=dp[i][j];

操作简单,不贴代码

UVA 12511

题意:最长公共上升子序列LIS,对,你没有听错就是最长上升子序列,两个序列公共的LCS。

思想结合一下咯

LIS设DP[i]表示以第i个数字结尾的最长上升子序列的长度
DP[i]=max(DP[j]+1){1<=j<=i-1}LCS设DP[i][j]表示以A串第i个字符结尾以B串第j个字符结尾的最长字串
当a[i]==b[j]时:DP[i][j]=DP{i-1][j-1]+1;
当a[i]!=b[j]时:DP[i][j]=max(DP[i-1][j],DP[i][j-1])LCIS设DP[i][j]表示以a串前i个字符b串的前j个字符且以b[j]为结尾构成的LCIS的长度
当a[i]!=b[j]时:DP[i][j]=DP[i-1][j]
当a[i]==b[j]时:DP[i][j]=max(DP[i-1][k])+1 1<=k<=j-1 && b[j]>b[k]

这个值得贴代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<cstring>
#include<cmath>
#include<sstream>
#include<iomanip>
#include<algorithm>
#include<vector>
using namespace std;
int dp[1005][1005],a[1005],b[1005],i,j,t,n1,n2,maxn; 
int main() 
{ scanf("%d",&t); while(t--){ scanf("%d",&n1); for(i=1;i<=n1;i++) scanf("%d",&a[i]); scanf("%d",&n2);for(i=1;i<=n2;i++) scanf("%d",&b[i]); memset(f,0,sizeof(f)); for(i=1;i<=n1;i++) { maxn=0; for(j=1;j<=n2;j++) { dp[i][j]=dp[i-1][j];//不相等if (a[i]>b[j]&&maxn<dp[i-1][j]) maxn=dp[i-1][j];//更新maxnif (a[i]==b[j]) dp[i][j]=maxn+1;//相等} } maxn=0; for(i=1;i<=n2;i++)if(maxn<dp[n1][i])maxn=dp[n1][i];printf("%d\n",maxn);}return 0;
}

HDU2845

http://acm.hdu.edu.cn/showproblem.php?pid=2845

题意:给出n*m的矩阵 如果选择了其中一个格子就可以得到该格子上的权值

但是它左边和右边的格子就不能选 然后上下两行的格子也不能选择 

 

很简单的dp 无非是选择与不选择  对于每一行来说 选择了j-1的路径 或者 选择j-2的路径 

而j-2的路径可以得到当前点的权值

然后对于每一列来说也是选择i-1的行或者是i-2的行的路径即可

#include<iostream>
#include<stdio.h>
#include<cstdio>
using namespace std;
#define maxn 222222
int x[maxn],y[maxn];
int main(){int n,m,ox;while(~scanf("%d%d",&n,&m)){for(int i=2;i<=n+1;++i){for(int j=2;j<=m+1;++j){scanf("%d",&ox);x[j]=max(x[j-1],x[j-2]+ox);}y[i]=max(y[i-1],y[i-2]+x[m+1]);}printf("%d\n",y[n+1]);}return 0;
}

K Multiple Longest Commom Subsequence 

http://newoj.acmclub.cn/contests/1359/problem/6

题意:最长公共子序列,要求序列每个元素重复k次,比如1122重复两次,111222重复三次。

输入两个字符串和k,输出长度。

最长公共子序列的一个变形。。。

动态规划。设dp[i][j]表示a串处理到i位置,b串处理到j位置的答案。预处理出从a串i位置向前数,第k个与i位置数
字相同的位置p[i],用相同方式处理出B串的q[i]。
则转移方程为dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-p[i]][j-q[j]]+1),其中第三种转移必须在a[i]=b[j]的情况下转移。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五次课 课上代码

第五次 双重循环——排序&#xff08;复习&#xff09; While循环 Break continue 字符串&#xff08;len&#xff0c;取值改值&#xff0c;格式化&#xff09; 列表生成式 >>> for i in range(4): for j in range(4): print(i,j) 0 0 0 1 0 2 0 3 1…

第六次课 课上代码

oj的使用 Python Split 函数&#xff08;优点&#xff1a;抽象、简洁。 举例&#xff1a;str\int\float\abs 具体实现&#xff09; ninput().split(" ") 3 4 >>> print(int(n[0])int(n[1])) 7 >>> print(12345) 15 l[1,2,3,4,5] >>&g…

橙白oj18训练作业1-题解、代码

学习资料和oj如何使用加软件官方qq群739979255 oj网址&#xff1a;http://oj.acm-icpc.top/ a题&#xff1a;原题为输入两个数&#xff0c;一行&#xff0c;用空格隔开&#xff0c;因为python操作对萌新来说略难&#xff0c;改为一行一个数&#xff0c;算出ab。 思路&#x…

橙白oj18训练作业2-题解、代码

http://oj.acm-icpc.top/ a题&#xff1a;三个数字排序 可以利用sort函数排序&#xff0c;或者自己想清楚逻辑自己写&#xff0c;我给出一个正确逻辑 &#xff08;拓展冒泡和其他排序参考https://blog.csdn.net/hebtu666/article/details/81434236&#xff09; a,b,cinput(…

时间空间复杂度概述

找个时间写一写时间复杂度和一些问题分类&#xff0c;也普及一下这方面知识。 如何衡量一个算法好坏 很显然&#xff0c;最重要的两个指标&#xff1a;需要多久可以解决问题、解决问题耗费了多少资源 那我们首先说第一个问题&#xff0c;要多长时间来解决某个问题。那我们可…

二叉树遍历算法总结

文章目录前提要素深度优先搜索DFS经典遍历算法前序遍历递归版迭代版中序遍历递归版迭代版后序遍历递归版迭代版Morris遍历算法中序遍历前序遍历后序遍历广度优先搜索BFS按层遍历参考资料前提要素 本文代码用Java实现。 //二叉树节点结构 public static class TreeNode {publi…

时间复杂度 P/NP/NPC

你会经常看到网上出现“这怎么做&#xff0c;这不是NP问题吗”、“这个只有搜了&#xff0c;这已经被证明是NP问题了”之类的话。你要知道&#xff0c;大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问…

kmp1-HDU1711 HDU1686 HDU2087 HDU3746

HDU 1711 kmp模板题 http://acm.hdu.edu.cn/showproblem.php?pid1711 #include<stdio.h> #include<string.h> #define N 1000005 int s[N]; int p[N]; int next[N]; int m,n; void getnext(){int j0,k-1;next[0]-1;while(j<m){if(k-1||p[j]p[k]){j;k;next[j]…

kmp2-HDU1358 HUST1010 POJ2406 POJ2752

HDU1358 http://acm.hdu.edu.cn/showproblem.php?pid1358 先构造出 next[] 数组&#xff0c;下标为 i&#xff0c;定义一个变量 j i - next[i] 就是next数组下标和下标对应值的差&#xff0c;如果这个差能整除下标 i&#xff0c;即 i%j0 ,则说明下标i之前的字符串&#xff0…

18暑期培训总结

暑假一共直播讲了七次课&#xff0c;每次一小时到一个半小时&#xff0c;前六次讲解python主要实用语法&#xff0c;最后一次讲了学习方法和简单基础的思想和算法。由于时间有限&#xff0c;不能做到很好&#xff0c;请见谅。 学院做题网站&#xff1a;橙白oj http://oj.acm-i…

第七次课 课上代码

时间空间复杂度&#xff08;例子&#xff1a;1-n求和&#xff09; 复杂度&#xff1a;https://blog.csdn.net/hebtu666/article/details/82463970 https://blog.csdn.net/hebtu666/article/details/82465495 二分 一个数组查找某个值1 2 3 5 6 7 8 9 10 15 20。。 查找11 …

数据结构课上笔记1

第一节课复习了c语言的一些知识&#xff0c;并简单介绍了数据结构这门课程。 1、引用和函数调用&#xff1a; 1.1引用&#xff1a;对一个数据建立一个“引用”&#xff0c;他的作用是为一个变量起一个别名。这是C对C语言的一个重要补充。 用法很简单&#xff1a; int a 5; …

并查集实现

并查集是什么东西&#xff1f; 它是用来管理元素分组情况的一种数据结构。 他可以高效进行两个操作&#xff1a; 查询a&#xff0c;b是否在同一组合并a和b所在的组 萌新可能不知所云&#xff0c;这个结构到底有什么用&#xff1f; 经分析&#xff0c;并查集效率之高超乎想象…

字符串上的简单动态规划

因为数据结构快学串了&#xff0c;以前又做过一些字符串dp的题&#xff0c;今天突然就想把它们写在一起吧。 直接开始 问题1&#xff1a;给两个字符串&#xff0c;求最长公共子串 问题2&#xff1a;给两个字符串&#xff0c;求最长公共子序列 问题3&#xff1a;给一个字符串…

线段树简单实现

首先&#xff0c;线段树是一棵满二叉树。&#xff08;每个节点要么有两个孩子&#xff0c;要么是深度相同的叶子节点&#xff09; 每个节点维护某个区间&#xff0c;根维护所有的。 如图&#xff0c;区间是二分父的区间。 当有n个元素&#xff0c;初始化需要o(n)时间&#xf…

树状数组实现

树状数组能够完成如下操作&#xff1a; 给一个序列a0-an 计算前i项和 对某个值加x 时间o(logn) 注意&#xff1a;有人觉得前缀和就行了&#xff0c;但是你还要维护啊&#xff0c;改变某个值&#xff0c;一个一个改变前缀和就是o(n)了。 线段树树状数组的题就是这样&#x…

数据结构课上笔记2

今天继续说明了一些基本概念&#xff0c;讲解了时间空间复杂度。 &#xff08;对于概念的掌握也很重要&#xff09; 元素之间的关系在计算机中有两种表示方法&#xff1a;顺序映像和非顺序映像&#xff0c;由此得到两种不同的储存结构&#xff1a; 顺序存储结构和链式存储结构…

双端单调队列

上次我们介绍了单调栈结构https://blog.csdn.net/hebtu666/article/details/82717317 这次介绍一种新的数据结构&#xff1a;双端队列&#xff1a;双端队列是指允许两端都可以进行入队和出队操作的队列&#xff0c;其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后…

KMP子字符串匹配算法学习笔记

文章目录学习资源什么是KMP什么是前缀表为什么一定要用前缀表如何计算前缀表前缀表有什么问题使用next数组来匹配放码过来构造next数组一、初始化二、处理前后缀不相同的情况三、处理前后缀相同的情况使用next数组来做匹配代码总览测试代码时间复杂度分析学习资源 字符串&…