dp

洛谷P1140 相似基因【线性dp】

匿名 (未验证) 提交于 2019-12-02 23:32:01
题目 : https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个‘-’使得他们匹配。(所以一共是5种字符) 这5种字符两两之间有一个匹配数值,要求使这两个字符串的匹配值之和最大。 思路: dp[i][j]表示匹配了s1中前i个字符和s2中前j个字符的最大匹配值。 完成s1[i]与s2[j]的匹配只有三种可能。 1.s1[i]之前已经匹配好,s2[j]配‘-’。即dp[i][j] = dp[i][j-1]+sco[s2[j]]['-'] 2.s2[j]之前已经匹配好,s1[i]配‘-’。即d[i][j] = dp[i-1][j]+sco[s1[i]]['-'] 3.s1[i]配s2[j]。即dp[i][j] = dp[i - 1][j - 1] + sco[s1[i]][s2[j]] 1 #include<cstdio> 2 #include<cstdlib> 3 #include<map> 4 #include<set> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<cmath> 9 #include<stack> 10 #include<queue> 11 #include<iostream>

动态规划入门_钱币兑换问题

匿名 (未验证) 提交于 2019-12-02 23:26:52
] ; 问题描述: Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。 Input 每行只有一个正整数N,N小于32768。 Output 对应每个输入,输出兑换方法数。 Sample Input 2934 12553 Sample Output 718831 13137761 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Scanner cin = new Scanner (System.in); 8 while(cin.hasNext()){ 9 int n = cin.nextInt(); 10 int [] value = {1,2,3}; 11 int [] dp = new int [32800]; 12 13 dp [0] =1; 14 for(int i = 0;i<value.length;i++){ 15 for(int j = value[i];j<=n;j++){ 16 dp[j] = dp[j]+dp[j-value[i]]; 17 } 18 } 19 20 21 System.out.println(dp[n]);

【图论】DAG上的dp:Codeforces 721C Journey

て烟熏妆下的殇ゞ 提交于 2019-12-02 19:07:08
DAG上的dp:Codeforces 721C Journey 题目描述 https://codeforces.com/problemset/problem/721/C Irina来到了城市Berlatov。该城市中有n个景点,编号从1至n,其中一些景点被单向道路连接。图中没有环路。最初Irina站在景点1,她的旅行终点是景点n。Irina想要游玩尽可能多的景点,但是,Irina在这座城市中的停留时间是有限的,她不能在这里呆超过T时间。帮助Irina规划在不超过T时间内,她可以游玩多少个景点。保证在T时间内至少有一条路径可以从景点1到达景点n。 Input 第一行:n,m,T——景点数量,道路的数量,游玩时间限制(2 ≤ n ≤ 5000,  1 ≤ m ≤ 5000,  1 ≤ T ≤ 109) 下面m行,每行u,v,t从u到v有一条路,且该条道路需要花费t时间通过。保证道路不会形成回路。数据保证有解。 Output 第一行输出数字k(2 ≤ k ≤ n)——Irina最多可游玩的景点 第二行按游玩顺序输出k个不同的景点的编号 如果有多种方案,输出其中一种 Examples input 4 3 13 1 2 5 2 3 7 2 4 8 output 3 1 2 4 input 6 6 7 1 2 2 1 3 3 3 6 3 2 4 2 4 6 2 6 5 1 output 4 1

NOIp提高组 2005 过河————dp+路径压缩

感情迁移 提交于 2019-12-02 12:09:44
题解:本题主要考查dp+路径压缩。 简要题意:有一条 n ( n < = 1 0 9 ) n(n<=10^9) n ( n < = 1 0 9 ) 米长的桥,桥上有 m m m 个石头。小青蛙从桥头开始,向终点跳。跳跃距离为 S S S 到 T T T ,求青蛙最少需要踩到的石子数。 1.dp:本题的难点不在dp的转移方程上,易得出:设 f [ i ] f[i] f [ i ] 为在 i i i 上经过的石头数 位置上有石头: f [ i ] = m i n ( f [ i ] , f [ i − j ] + 1 ) ; f[i]=min(f[i],f[i-j]+1); f [ i ] = m i n ( f [ i ] , f [ i − j ] + 1 ) ; 位置上无石头: f [ i ] = m i n ( f [ i ] , f [ i − j ] ) ; f[i]=min(f[i],f[i-j]); f [ i ] = m i n ( f [ i ] , f [ i − j ] ) ; 2.路径压缩:本题 n n n 的规模极大,但 m m m 很小,所以就需要巧妙的路径压缩。我们发现 s ∗ t s*t s ∗ t 以后的每个点都可以到达, 所以我们只需将每两个石头超过 s ∗ t s*t s ∗ t 的距离缩成 s ∗ t s*t s ∗ t 就可以了 代码如下:

期望DP的一般思路

◇◆丶佛笑我妖孽 提交于 2019-12-02 11:28:42
期望DP的一般思路 转载自_ new2zy _ 期望 \(dp\) ,也加概率 \(dp\) 一般来说,期望 \(dp\) 找到正确的状态后,转移是比较容易想到的。 但一般情况下, 状态一定是“可数”的 事实上, 将问题直接作为 \(dp\) 的状态 是最好的。 如,问 “ \(n\) 人做 \(XX\) 事的期望次数” ,那么不妨设计 状态为 \(f[i]\) 表示 \(i\) 个人做完事的期望 。 转移一般是递推 ,通常分两种,一种是从上一个状态转移得(填表法),另一种是转移向下一个状态(刷表法)。 有时期望 \(dp\) 需以最终状态为初始状态转移,即 逆推 。 如f[i]表示期望还要走f[i]步到达终点。这种状态的转移是 刷表法 形如 \(f[i]=∑p[i→j]*f[j]+w[i→j]\) ,其中 \(p\) 表示转移的概率 , \(w\) 表示转移对答案的贡献 。 一般来说, 初始状态确定时可用顺推,终止状态确定时可用逆推。 大概期望 \(dp\) 的套路就是这样了吧。。。 (我还是菜讲得不太好) 来源: https://www.cnblogs.com/fusiwei/p/11743090.html

洛谷-2657 [SCOI2009]windy数

核能气质少年 提交于 2019-12-02 11:19:50
题目描述 windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入格式 包含两个整数,A B。 输出格式 一个整数 输入输出样例 输入 #1 1 10 输出 #1 9 输入 #2 25 50 输出 #2 20 说明/提示 100%的数据,满足 1 <= A <= B <= 2000000000 。 解释:数位 d p dp d p , d p [ i ] [ j ] : i dp[i][j]:i d p [ i ] [ j ] : i 位,以 j j j 为开头满足条件的数, d p [ i ] [ j ] + = d p [ j − 1 ] [ k ] , a b s ( k − j ) > = 2 dp[i][j]+=dp[j-1][k],abs(k-j)>=2 d p [ i ] [ j ] + = d p [ j − 1 ] [ k ] , a b s ( k − j ) > = 2 ,就是以0开头的话我们需要特殊处理一下,如果以0开头,则无 a b s ( k − j ) > = 2 abs(k-j)>=2 a b s ( k − j ) > = 2 条件,并且把它保存在 t e te t e 数组里面 #include<iostream>

蠡口174. Dungeon Game

独自空忆成欢 提交于 2019-12-02 11:12:51
一开始想的是设所求数为x,那么遍历所有可能路径,看最小血量花销。 后来想想对矩阵一顿操作后,返回一个值,而非所有路径的具体值,很有可能是DP。于是往DP的方向想,我们能确定的是救到公主后,骑士的血量至少为1,然后求起始位置是骑士的最低血量可以是多少。这样一想,自然是从右下往左上递推。 1、我们建立dp二维数组: dp[i][j]表示进入房间(i,j)之前骑士血量可以最低是多少。 2、初始边界:   2.1)我们先来想想进入最后的房间之前骑士血量可以最低是多少?最后一个房间可以是:     1)怪兽(即dungeon[m-1][n-1]<0),那么骑士在这个房间会失血,如果想活着求出公主,那么进入最后的房间之前骑士至少得有1-dungeon[m-1][n-1]的血量。故dp[m-1][n-1]=1-dungeon[m-1][n-1];     2)空房间(即dungeon[m-1][n-1]==0),那骑士在进入最后的房间之前只需有1滴血就可以继续苟延残喘地就下公主。故dp[m-1][n-1]=1;     3)魔法加成(即dungeon[m-1][n-1]>0),那骑士在进入最后的房间之前,也需1滴血,不然骑士在开最后一个房门的时候就死了。dp[m-1][n-1]=1; 综合1)、2)、3)不难总结出dp[m-1][n-1]=max(1,1-dungeon[m-1][n-1]) 。

DP练习

你。 提交于 2019-12-02 10:37:17
马上 要联赛了,我 又 要来抱一抱DP的佛脚 \(QWQ\) 最近膜你赛的题目的常规 \(dp\) 都不是很难推,但是优化这一方面确实不是很好,所以我来这里复(学)习一下一些常见DP优化和其他类型的DP(dalao勿D)qwq (未完待续) 1、P2059 [JLOI2013]卡牌游戏 2、P1850 换教室(期望DP) ## [1、P2059 [JLOI2013]卡牌游戏](https://www.luogu.org/problem/P2059) 这道题也是一道比较基础的 (算是) 概率dp吧。 我们首先可以来分析一下这道题目的状态,我们要明白这道题的操作流程,如果你不是很懂的话请自行那一副牌来模拟一下。 我们现在来看一下这个 \(dp\) 的状态转移的方程。 \(f[i][j]\) 表示还剩 \(i\) 个人的时候庄家向后数 \(j\) 位的时候的人获胜的概率。 所以,我们现在来考虑一下我们 \(f[i][]\) 的状态一定是从 \(f[i-1][]\) 转移来,所以我们现在就来讨论一下 \(j\) 的情况。 这个时候我们可以来枚举一下当 \(j\) 为庄家是所抽的牌为 \(k\) 时的情况。这时我们可以假设此时淘汰的人为 \(w\) ,如果 \(w==j\) 那么这个情况就不用考虑了, (自己的没了,还玩个锤子啊) 如果, \(w<j\) 的时候,这时候 \(j\)

洛谷P3205 合唱队

你说的曾经没有我的故事 提交于 2019-12-02 07:56:37
题目 区间dp。但是跟平常的区间dp不同的是,这个题仅仅只是运用了区间dp的通过小区间的信息更新大区间的信息,而没有运用枚举断点的区间dp一般思路。 这个题我们首先发现每个人在插入的时候一定插入到队伍的最前方或最后方,所以当要插入该数的时候,要比较的数是队伍的最前方或最后方,然后用加法原理。与其说是dp,不如说是递推。 #include <bits/stdc++.h> #define N 1000110 #define int long long const int mod = 19650827; using namespace std; int n, a[N]; int dp[1001][1001][2];// 0表示从左边 signed main() { scanf("%lld", &n); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), dp[i][i][0] = 1; for (int l = 2; l <= n; l++) for (int i = 1; i + l - 1 <= n; i++) { int j = i + l - 1;//不需要枚举断点,因为不需要从断点转移过来, 因为当前状态的前一个插入的数必定是i+1或者j-1,然后判断 if (a[j] > a[j - 1]) dp[i][j][1] += dp

【ZJOI2004】骑士

陌路散爱 提交于 2019-12-02 05:57:21
十年前的ZJOI而我现在还是切不掉我是不是可以退役了 题目 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。 输入格式 第一行包含一个正整数N,描述骑士团的人数。接下来N行,每行两个正整数,按顺序描述每一名骑士的战斗力 和他最痛恨的骑士。N ≤ 1 000 000,每名骑士的战斗力都是不大于 1 000 000的正整数 输出格式 应包含一行,包含一个整数