随笔分类 -  DP

摘要:连接:http://poj.org/problem?id=1191思路:额,其实就是直接搞记录一下就可以了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define loop(s,i,n) for(i = s;i = 0) return dp[k][x][y][xx][yy];46 if(k == n)47 return sum[x][y][xx][yy];48 49 int i,j,ans;... 阅读全文
posted @ 2013-09-02 16:31 某某。 阅读(489) 评论(0) 推荐(0)
摘要:连接:http://poj.org/problem?id=1054题意:就是一个格子里一条线上最长有几个青蛙(青蛙间隔相同)~。但是其实青蛙的起点重点必须是在外面。直接写一个搜就是。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define loop(s,i,n) for(i = s;i = 1 && x = 1&&y <= c)27 return 1;28 29 return 0;30 31 }32 int find( 阅读全文
posted @ 2013-09-02 16:29 某某。 阅读(223) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=3280题意就是给你一个字符串,含有n个字母,每个字母可以添加可以去除,添加和删除字母有花费,问组成一个回文串。思路就是每个回文串的最大子串必定有一个开头一个结尾位置,最终位置为0~len-1,这样但是每一对起始位置都会有一个回文长度,对每一个长度进行搜就可以了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define loop(s,i,n) for(i ... 阅读全文
posted @ 2013-09-02 16:25 某某。 阅读(215) 评论(0) 推荐(0)
摘要:连接:http://poj.org/problem?id=2029题意:给你一个map,然后在上面种树,问你h*w的矩形上最多有几棵树~这题直接搜就可以。不能算是DP用树状数组也可作。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define loop(s,i,n) for(i = s;i > n && n){21 memset(map, 0, sizeof(map));22 memse... 阅读全文
posted @ 2013-09-02 16:09 某某。 阅读(155) 评论(0) 推荐(0)
摘要:题意:给你一棵树,每条边都有值W,然后问你去掉一条边,令val = w*max(两颗新树的直径),求val最小值~做法,先求树的直径,然后算出直径上每个点的最长枝条长度。这样对于每一条边,假如是枝条边,那么val = w*直径,如果不是那么val = max(w*(两颗新树的直径))。新树直径说到这里已经很好算了。DFS爆栈了一下午 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define loop(s,i,n) for(i... 阅读全文
posted @ 2013-08-19 18:51 某某。 阅读(282) 评论(0) 推荐(0)
摘要:题意:不说了很好懂、这题这么水= =。。。当时竟然没有勇气暴力搜一下。昨天(好吧前天。)比赛的时候胃疼,看到这题想了一个办法就是对每一个出现最短的C串前后连接然后对这个串求最长公共子序列。其实优化一下就是现在的答案啊~~!!!!给赵鹏说了赵鹏说不可能这么过。。然后就没想。就这样这么水的一道题都没过!!!!桑心啊~代码: 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 char sa[1005]; 7 char sb[1005]; 8 char sc[1005]; 9 int c[... 阅读全文
posted @ 2013-08-17 01:58 某某。 阅读(305) 评论(0) 推荐(0)
摘要:题意:给你N个珠宝和一个K,每个珠宝上面都有数字,这个珠宝做成项链,把珠宝上的数字拼起来如果可以整除掉K,那么久说这个数字为wonderful value,问你有多少种方案可以组成WONDERFUL VALUE。对每个数取余并记录多少位,这样的话拼数的时候好操作。详细解法贴个结题报告吧。代码: 1 #include 2 #include 3 using namespace std; 4 int dp[50005][300]; 5 int a[100005]; 6 int len[100005]; 7 int decmod[50005 1;i--)56 {57 ... 阅读全文
posted @ 2013-08-16 21:18 某某。 阅读(258) 评论(0) 推荐(0)
摘要:题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串。连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622网上也有用后缀数组搞得、思路(虎哥):用字典树把每一个字符串对应成一个整数 相同的字符串对应到相同的整数上把所用的串对应的整数放在一个数组里 比如书字符串s[l...r]对应的整数是 k那么二维数组 [l][r] 就等于k假设一个对应好的二维数组左下角是原点3 4 5 22 3 4 01 6 0 02 0 0 0这样求解 从l到r的不同字符串的个数 其实就是求 从[l][r] 到右下角所在的矩阵所包含不同整数的个数(不包括0)这里 阅读全文
posted @ 2013-08-03 09:58 某某。 阅读(610) 评论(0) 推荐(0)
摘要:题意:给你一个字符串,问你整个字符串有多少个回文字串。(可以不连续)状态方程 dp[i][j] = dp[i+1][j]+dp[i][j-1]+dp[i+1][j-1]+(a[i] == a[j]? 0:1;)对于长度为1 2 3 的时候特判一下就可以了。当然状态方程在些的时候会有改动,详细的还是看代码吧。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define loop(s,i,n) for(i = s;i 2)38 dp[i]... 阅读全文
posted @ 2013-08-02 14:28 某某。 阅读(352) 评论(0) 推荐(0)
摘要:题意:给你一个长度小于等于16的字符串,每次可以删除一个回文传,问你最少删除干净的字数。状态+dpdp[i] = min(dp[i],dp[j]+dp[j^i]);(j是i的字串);连接:http://acm.hdu.edu.cn/showproblem.php?pid=4628代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define loop(s,i,n) for(i = s;i < n;i++) 9 10 using namespace std;11 i... 阅读全文
posted @ 2013-07-31 16:09 某某。 阅读(232) 评论(0) 推荐(0)
摘要:题意就是找一个 左右上下对称的正方形矩阵。连接:http://acm.hdu.edu.cn/showproblem.php?pid=4618没想到记忆+dp和暴力就能水过。。。//记忆话搜索+dp#include #include #include #include using namespace std;int a[301][301];char dp[301][301][301];int n,m;int judge(int i,int j,int len){ int k; if(i+len-1 >= n) return 0; if(j+len-1 >= m) return ... 阅读全文
posted @ 2013-07-29 14:16 某某。 阅读(265) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4604思路:就是模拟一下,求每一个开始的非上升和非下降序列。然后求重复的数,由于求出来可能不会是我们想要的序列如22221122233这样的话求出来的会是2222222 222222233,而我们想要的到的是112222,所以不能用普通的,而是用N*logN(当然也是因为数列太长),而我们得到的是1122222多处一个2这个2是11之前留下的,但是因为2比1大才留下,那么2一定会留在最长上升里面,所以2是会被算作重复的减掉。代码: 1 #include 2 #include 3 #incl... 阅读全文
posted @ 2013-07-25 11:54 某某。 阅读(357) 评论(0) 推荐(0)
摘要:连接:http://poj.org/problem?id=3211俩人只能一起溪一中衣服也就是说两人洗的时候就是01背包就是,然后吧各种衣服所用时间相加。。。View Code 1 #include <stdio.h> 2 #include <string.h> 3 4 struct node 5 { 6 char color[20]; 7 int sum; 8 int a[105]; 9 int count;10 }col[15];11 int count;12 int search(char s[],int m)13 {14 int i;15 ... 阅读全文
posted @ 2012-08-21 21:28 某某。 阅读(153) 评论(0) 推荐(0)
摘要:题目连接http://poj.org/problem?id=1159这道题原来见过,那时候没学DFS什么的,以为是搜索然后直接暴搜,但是说真的真是没有想到这题竟然是DP,那时候也没学DP就放弃了。。。这道题的思路就是把整个问题分解成小问题,然后从下往上来求。。。我们先设一个DP[N][N],它里面是每个i~j变成回文的最小添加量,也就是说我们可以看做DP后已经全部都是回文。那么DP[1][N]就可以满足一个状态方程if(STR[1] == STR[N]I = 1,J = N;DP[1][N] == DP[I+1][J-1] + 1 (STR[I] == STR[J]) DP[... 阅读全文
posted @ 2012-08-21 21:04 某某。 阅读(168) 评论(0) 推荐(0)
摘要:题目连接http://poj.org/problem?id=1088这道题其实说实话知道了思路真的很简单,但是那天晚上做的时候很苦逼的错了好多地方然后查还没查出来= =。。。表示DFS真的很吃力= =。。。所谓的记忆化搜索现在看来就是吧上搜索过的给存起来。。。需要一个状态方程dp[i][j] = max(dp[i+1][j],dp[i-1][j],dp[i][j+1],dp[i][j-1]);四个方向搜一遍找到最合适的即可。。。代码View Code 1 #include <string.h> 2 #include <stdio.h> 3 int num[105][10 阅读全文
posted @ 2012-08-21 20:11 某某。 阅读(352) 评论(1) 推荐(0)
摘要:题目大意就是 你有足够多的坦克,让你用尽量多的坦克去占领电厂。有N+1各节点,0~n ,0为出发点,1~n为电厂。要想控制摧毁电厂,战胜对方,只需要占领一般的电量即可。但是特克会耗油,所一给你m条路,让你去计算最小耗电量~而且如果坦克不能通过m条路到达任意一个电厂的话就输出'impossible'连接:http://acm.hdu.edu.cn/showproblem.php?pid=3339代码:dijView Code 1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 0x5fffff 阅读全文
posted @ 2012-08-15 10:56 某某。 阅读(172) 评论(0) 推荐(0)
摘要:连接http://acm.hdu.edu.cn/showproblem.php?pid=2546这道题一开始我想错了以为是贪心。。。当时看到这道题的思路就是首先要-5然后用DP最后用看剩下来谁最大就买谁~后来实在不知道应该怎么处理,终不能用VIS来跟踪标记把= =。。。然后觉得思路错了, 应该是吧最大的那个菜留到最后再买~View Code 1 #include <stdio.h> 2 #include <string.h> 3 /*int cmp(const void *a,const void *b) 4 { 5 return a-b; 6 }*/ 7 int ma 阅读全文
posted @ 2012-08-14 21:55 某某。 阅读(126) 评论(0) 推荐(0)
摘要:地址连接:http://acm.hdu.edu.cn/showproblem.php?pid=2955Roy 去抢N个银行,去抢第j个银行时能得到Mj的钱,被抓的概率为Pj。问在被抓的概率不大于P时能抢到的最多的钱是多少。这道题一开始我以为用P去当背包容量,但是P是double型,所以制定不行= =。。然后没大有思路。。。后来看到网上的思路就是逆向思维,将钱的总数当做背包容量~于是转成以所有银行的总资产为背包容量V。。求最大的逃跑概率。。也就是我们一个都不偷的时候我们逃跑的概率为1,每当我们偷了一个我们都要*(1-p[i])我们成功逃跑的概率状态转移方程:dp[j] = max ( dp[j] 阅读全文
posted @ 2012-08-14 21:51 某某。 阅读(213) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=3211大意就是 一个人洗衣服,然后找他媳妇帮忙。有n种颜色的衣服,和m件衣服,每件衣服的颜色和洗出来的时间都会给出来。再洗的时候两个人不能同时洗一件衣服,但是可以洗两件衣服,但是不同种颜色的衣服不能同时洗~让你求所需要的最少时间。这样我们就可以知道,这道题就是对每一种颜色的衣服所需要的时间进行dP就OK了,对每一种颜色的衣服DP就相当于给你几个正数让你把他分的尽量平均,也就是把和加起来然后除以2作为背包容量~代码:#include <stdio.h>#include <string.h>struct nod 阅读全文
posted @ 2012-08-14 00:10 某某。 阅读(428) 评论(0) 推荐(0)
摘要:题目连接http://poj.org/problem?id=3624View Code 1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int n,i,j,w[3500],val[3500],v,f[20000]; 6 while(~scanf("%d %d",&n,&v)) 7 { 8 9 for(i = 1;i <= n;i++)10 {11 scanf("%d %d",&w[i],&val[i]);12 }13 阅读全文
posted @ 2012-08-13 21:57 某某。 阅读(187) 评论(0) 推荐(0)