
dp
文章平均质量分 71
秋天的风--
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
展开
-
poj 2151 概率dp(求概率)&&poj3071全概率公式
/*思路:http://www.cnblogs.com/rainydays/archive/2011/07/01/2095913.html题意:在acm比赛中,n题,t队。给出每个队做对每题的概率,问每队至少对一题,至少有一队做对至少m题的概率分析:dp,f[i][j]表示第i个队伍做对第j题的概率。g[i][j][k]表示第i个队伍对于前j题而言做对k道的概率。g[i][j][k]原创 2015-05-01 08:46:39 · 594 阅读 · 0 评论 -
hdu 4435 bfs+贪心
/*题意:给定每个点在平面内的坐标,要求选出一些点,在这些点建立加油站,使得总花费最少(1号点必须建立加油站)。在i点建立加油站需要花费2^i。建立加油站要求能使得汽车从1点开始走遍全图所有的点并回到1点,途中汽车加油次数不限,每个加油站的使用次数不限,但是汽车油箱有上限d(加满油可以跑距离d)。第i个点的费用=比i小的点的所有费用和+1;所以从后向前判断,如果当前点不为加油站在这个点前原创 2014-11-01 16:50:45 · 566 阅读 · 0 评论 -
数位dp 3943 二分法
转载:http://blog.youkuaiyun.com/wdcjdtc/article/details/39177905#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"using namespace std转载 2014-10-04 21:31:17 · 479 阅读 · 0 评论 -
概率dp入门
/*第一道概率dp看别人的思路,不过总算理解为什么求期望从后往前了地址:http://blog.youkuaiyun.com/morgan_xww/article/details/6774708*/#include#include#define N 1100double dp[N][N];int main() { int n,s,i,j; while(scanf("%d%d"原创 2014-10-14 15:51:08 · 582 阅读 · 0 评论 -
hdu 3943 经典数位dp好题
/*题意:求出p-q的第j个nya数数位dp,求出p-q的所有nya数的个数很好求,但是询问求出最终那个第j个值时是我不会求了看了下别人的思路具体就是把p-q的第j个转化成0-q的第low+j个(其中low为小于等于p的nya数)枚举q的每一位数字,枚举位数值并进行比较直至求出每一位的值。经典好题,长见识了。*/#include#include#define ll __int64原创 2014-10-04 21:15:24 · 580 阅读 · 0 评论 -
hdu 4734 数位dp
/*数位dp,记忆化搜索写法注意memset(dp,-1,sizeof(dp))是放在外面的,这样保证每次搜索时存的值满足下一次也可以用;如果放在里面就会超时每个长度有10000种状态*/#include#include#define N 20int len,digit[N],dp[N][10000];int dfs(int len,int cnt,int ok) {原创 2014-10-03 18:48:41 · 837 阅读 · 0 评论 -
hdu 3697 贪心
#include#include#include#define inf 0x3fffffff#define N 1100struct node {int l,r;}f[N];int ff[N];double d;int Min(int aa,int bb) {return aa>bb?bb:aa;}int Max(int aa,int bb) {return aa>bb原创 2014-10-11 18:17:02 · 802 阅读 · 0 评论 -
hdu 4722 数位dp
/*数位dp开一个二维数组用来储存前len状态对10取余,有10种状态0-9;然后直接过一遍就行了*/#include#include#define ll __int64#define N 20ll digit[N],dp[N][11];ll dfs(ll len,ll cnt,ll ok) { if(!len) { if(cnt==0)//如果可以整除返回1原创 2014-10-02 18:32:30 · 621 阅读 · 0 评论 -
hdu 2089 记忆化搜索写法(数位dp)
/*记忆化搜索,第二维判断是否是6*/#include#include#define N 9int dp[N][2],digit[N];int dfs(int len,int cnt,int ok) {//cnt代表是否是6,ok代表前一个是当前为最大值,并且当前也是最大值 if(!len)return 1; if(!ok&&dp[len][cnt]!=-1)return原创 2014-10-01 21:31:11 · 898 阅读 · 0 评论 -
hdu 1185 状压dp 好题 (当前状态与上两行有关系)
/*状压dp刚开始&写成&&看了好长时间T0T.状态转移方程 dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[i][j]);(第i行的第j个状态有上一行的第k个状态得到) num[i][j]有两个功能,第一:判断第i行第j个状态是否合法 第二:判断第i行第j个状态的数目*/#include#in原创 2014-10-02 21:25:32 · 836 阅读 · 0 评论 -
cf 55D 数位dp 好题
/*刚开始我考虑0的情况,想将他剔除就将lcmn设为-1,这样还要判断0和lcmn是-1的情况很麻烦而且但是一直出错后来觉得不用管0的情况就行了,可以认为符合。解:将lcmn离散化,因为1-9的公倍数必是2520的因子并且只有48个所以用一个数组离散化,记忆的时候直接调用离散数组即可因为一个数的所有数字的最小公倍数必定是2520的因子,所以将这个数对2520取余缩小范围并记忆三维,第一原创 2014-10-07 17:25:54 · 932 阅读 · 0 评论 -
fzu 2113 数位dp
#include#include#define N 20#define ll __int64ll dp[N][N];//最多记忆400种情况ll digit[N];ll dfs(ll len,ll cnt,ll ok) { if(!len) return cnt; if(!ok&&dp[len][cnt]!=-1) return dp[len][cnt]; ll i,an原创 2014-10-05 16:45:25 · 484 阅读 · 0 评论 -
hdu 4091 数学思维题贪心
/*参看博客地址:http://blog.youkuaiyun.com/oceanlight/article/details/7857713重点是取完最优的后剩余的rest=n%lcm+lcm;中性价比小的数目num<lcm/性价比小的体积,因为如果大于的话肯定可以由性价比好的替换。然后枚举。从体积大的开始枚举次数少。注意64位*/#include#include#include#defi原创 2014-11-03 16:56:59 · 578 阅读 · 0 评论 -
hdu 3652数位dp
/*数位dp题意:找到1-n之间包含13这个子串并且能够整除13的数解:刚开始dp[N][N][2]这里的2用来记录是否为13表示当前位是否为13,我把上一位为1当前位为13和上一位部位1这种情况在数组中没有记录。*/#include#include#define N 14int dp[N][N][3];int digit[N];int dfs(int len,int mod原创 2014-10-05 13:27:27 · 819 阅读 · 0 评论 -
NUBT1475 数位dp(记忆化搜索)
/*数位dp,记忆化搜索,重要是边界对于每一位有三种情况1.是1并且不是边界(123中1就是边界)。2,是1是边界。3,不是1对于第一种情况,直接ans+power(len-1)即可,第二种情况,直接加上剩余的必包含1,比如145,对于第一位1必定有100-145总共146个数必包含一个1对于第三种情况不用考虑当然中间状态要记录,记录的是不是边界的状态*/#include#inc原创 2015-05-03 11:20:49 · 814 阅读 · 0 评论 -
hdu 4870 期望问题(高斯消元)
/*初学概率期望问题参考:http://blog.youkuaiyun.com/a601025382s/article/details/38047905*/#include#include#include#include#includeusing namespace std;#define N 300struct node { double ma[N][N];}a;void原创 2015-04-28 10:09:57 · 493 阅读 · 0 评论 -
ZOJ3329之经典概率DP(这类概率dp的解题规律)
/*题意:有三个骰子,分别有k1,k2,k3个面。每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。当分数大于n时结束。求游戏的期望步数。初始分数为0分析:假设dp[i]表示拥有分数i到游戏结束的期望步数则 (1):dp[i]=SUM(p[k]*dp[i+k])+p[0]*dp[0]+1;//p[k]表示增加分数为k的概率,p[0]表示分数变为0的概率转载 2015-04-30 11:00:44 · 621 阅读 · 1 评论 -
hdu 4035 经典期望dp
转载:http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html/*HDU 4035 dp求期望的题。 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki)转载 2015-04-30 15:42:11 · 496 阅读 · 0 评论 -
zoj 3229 期望dp 比较经典
/*思路从这个博客:http://blog.youkuaiyun.com/morgan_xww/article/details/6775853思路:(//后面是我自己添加上的帮助理解,其余解题思路的是转载,我用的记忆化搜索写的) dp求期望的题。 题意: 有三个均匀的骰子,分别有k1,k2,k3个面,初始分数是0, 当掷三个骰子的点数分别为a,b,c的时候,分数清零,否则原创 2015-04-30 10:56:07 · 555 阅读 · 0 评论 -
hdu 4336 期望dp
解:用状压dp[0]=p1*dp[1]+p2*dp[2]+p3*dp[4]...+(1-p1..)dp[0]+1; .../*用递推形式312ms*/#include#include#include#define eps 1e-10#define N 20double f[N];int n;double dp[1<<N];int main(){原创 2015-04-29 13:29:31 · 556 阅读 · 0 评论 -
hdu 1421经典dp
#include#include#define N 2001#define inf 0x3fffffffint a[N],dp[N][N];int Min(int v,int vv) {return v>vv?vv:v;}int cmp(const void *a,const void *b) {return *(int *)a-*(int *)b;}int main() {原创 2015-04-01 10:16:27 · 477 阅读 · 0 评论 -
hdu1160简单dp最长下降子序列
/*简单dp,要记录顺序解:先排序,然后是一个最长下降子序列 ,中间需记录顺序dp[i]=Max(dp[i],dp[j]+1);*/#include#include#include#define N 1100/*w,s代表重量和速度,index记录原来输入时的顺序下标,pre指向排序后的上一个下标,answer记录排序后每一个位置的最优值*/typedef struct no原创 2015-04-01 10:31:32 · 838 阅读 · 0 评论 -
hdu 2845简单dp
/*递推公式dp[i]=MAX(dp[i-1],dp[i-2]+a[j])*/#include#include#define N 210000int a[N],f[N],dp[N];int Max(int v,int vv) {return v>vv?v:vv;}int main() { int n,m,i,j,k; while(scanf("%d%d",&n,&原创 2015-04-01 10:14:17 · 458 阅读 · 0 评论 -
hdu 1500 dp
/*状态转移方程式:dp[i][j]=Min(dp[i][j-1],dp[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j]));依次求出第i个人在第j个数时的所求的最小值*/#include#include#define N 5100int dp[1100][N];int a[N];int Min(int v,int vv) {return v>vv?原创 2014-12-02 13:19:26 · 625 阅读 · 0 评论 -
uestc 250 数位dp(水)
/*数位dp水题开两维一个记录长度,一个记录上一个数*/#include#include#define N 13int dp[N][N];int digit[N];int dfs(int len,int cnt,int ok) { if(!len)return 1; if(!ok&&dp[len][cnt]!=-1) return dp[len][cnt]; i原创 2014-10-05 13:55:58 · 780 阅读 · 0 评论 -
hdu 2224 双调欧几里得旅行商问题tsp
/*题意:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的一般形式为NP的(在多项式时间内可以求出)建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。每个点都要走一次,且每个点只能走一次,求最短路径;相当于一个人从一个点出发分两条不同的路线走,不过一个走在前面一个在后面走。设dp[i][j]代原创 2014-09-27 21:08:28 · 814 阅读 · 0 评论 -
poj 2404 中国邮递员问题 欧拉回路判定+状压dp
/*状压dp邮递员问题:求经过任意点出发经过每一条边一次并回到原点。解法:1、如果是欧拉回路那么就是所有的边的总和。 2、一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状压dp。*/#include#include#define N 20#define inf 1000000000int ma[N][N];int lower[N];int原创 2014-09-17 19:26:07 · 1201 阅读 · 0 评论 -
lightoj 1422 区间dp
区间DP,鼻祖题目,认知了 什么事区间DP,题意有点难理解,有N个宴会,对于每一个宴会,女猪脚都要穿一种礼服,礼服可以套着穿,但是脱了的不能再用,参加宴会必须按顺序来,从第一个到第N个,问参加这些宴会最少需要几件礼服,拿第一个案例来说把41 2 1 2,有4个宴会,第一个需要礼服种类为1,第二个需要礼服种类为2,以此往下推:参加第一个宴会时穿礼服1,参加第二个时,礼服1不要原创 2014-05-10 12:17:26 · 426 阅读 · 0 评论 -
hdu 2491 贪心
#include#include#define N 110000struct node {int u,v,len,time;}ma[N];int cmp(const void *a,const void *b){return (*(struct node *)a).time-(*(struct node *)b).time;}int main() { int n,i,k原创 2014-05-16 09:54:55 · 531 阅读 · 0 评论 -
fzoj 2113数位dp
参考http://blog.youkuaiyun.com/xingyeyongheng/article/details/8785785#include#define ll long long#define N 20ll dp[N];//dp[N]记录长度为i的一的个数ll power(ll a) { ll sum=1,i; for(i=1;i sum*=10; ret原创 2014-05-08 17:35:21 · 1021 阅读 · 0 评论 -
数位dp无前导零
题目链接:点击打开链接#include #include #include #include #include #include #include #include using namespace std;int A[12];int f[12][10];//f[i][j]代表长度为i,最高位为j的windy数个数void转载 2014-05-08 09:25:45 · 857 阅读 · 0 评论 -
hdu 2089 数位dp入门题
#include//dp[i][0]代表不存在不吉利数字//dp[i][1]代表不存在不吉利数字但是以2开头//dp[i][2]代表存在不吉利数字#define N 10int dp[N][3];void init() {int i;dp[0][0]=1;for(i=1;i dp[i][0]=dp[i-1][0]*9-dp[i-1][1];//当前不存原创 2014-05-07 18:53:23 · 585 阅读 · 0 评论 -
hdu 3555数位dp基础入门题
#include#define N 20long long dp[N][3];void init(){long long i;dp[0][0]=1;for(i=1;i dp[i][0]=dp[i-1][0]*10-dp[i-1][1]; dp[i][1]=dp[i-1][0]; dp[i][2]=dp[i-1][2]*10+dp[i-1][原创 2014-05-07 20:43:51 · 487 阅读 · 0 评论 -
hdu 1520 树形dp入门题
#include#include#define N 6100int a[N];int dp[N][2];struct node { int u,v,w,next;}bian[N*2];int head[N],yong,visit[N];void addedge(int u,int v) {bian[yong].v=v;bian[yong].next=he原创 2014-04-30 19:03:45 · 546 阅读 · 0 评论 -
hdu 2844 多重背包二进制优化
#include#define N 110000#includeint dp[N];int main() {int n,m,i,j,a[N],b[N],k,h;while(scanf("%d%d",&n,&m),n||m) {memset(dp,0,sizeof(dp)); for(i=1;iscanf("%d",&a[i]);for(i=1;原创 2014-03-07 20:33:48 · 511 阅读 · 0 评论 -
fzu 2129
第i个元素a未出现过:dp[i] = (2 * dp[i-1] + 1) % mod;visit[a]代表a最后出现的位置第i个元素a出现过:dp[i] = (2 * dp[i-1] - dp[visit[a]-1]) % mod;(注意判负)例abb第一个b : a b ab第二个b :a b ab ab bb abb故要减去dp[visit[a]-原创 2014-03-12 14:29:18 · 547 阅读 · 0 评论 -
hdu 2546 0-1背包
#include#include#define N 1100int dp[N],a[N];int main() {int n,m,i,j,max,k;while(scanf("%d",&n),n) {max=0;k=0;for(i=1;iscanf("%d",&a[i]);if(a[i]>max) {max=a[i];k=i;}}scan原创 2014-03-01 14:10:21 · 487 阅读 · 0 评论 -
hdu 2602 简单0-1背包模板题
#include#include#define N 1100int dp[N];int main() {int n,t,m,a[N],b[N],i,j,v;scanf("%d",&t);while(t--) {scanf("%d%d",&n,&v);for(i=1;iscanf("%d",&a[i]);for(i=1;iscanf("%d",&b[i原创 2014-02-28 18:27:39 · 473 阅读 · 0 评论 -
hdu 2571
#include#include#define inf -9999999#define N 40int dp[N][1100];int ma[N][1100];int MAX(int a,int b) {return a>b?a:b;}int main() { int n,m,i,j,t,k; scanf("%d",&t); while(t--原创 2014-05-16 14:29:55 · 472 阅读 · 0 评论 -
poj 2955 区间dp入门题
第一道自己做出来的区间dpt原创 2014-05-11 15:11:42 · 570 阅读 · 0 评论