
DP
文章平均质量分 63
shiqi_614
这个作者很懒,什么都没留下…
展开
-
Codeforces Beta Round #11 D. A Simple Task
题意:有N(最多19个)个点,M条边,问有多少个简单环。状态压缩,dp[st][i],终点是i,st表示这个环走过哪几个,定义起点为这些走过的点里最小的。#pragma comment(linker, "/STACK:102400000,102400000")#include #include #include #include #include #include #incl原创 2013-09-07 01:53:26 · 3001 阅读 · 0 评论 -
uva 620 Cellular Structure
题意感觉有点奇怪,直接贴代码了。。#include #include #include using namespace std;const int N=1000;char str[N];int map[N][N];bool vis[N][N];int dp(int,int);int main(){ int t; scanf("%d",&t); whi原创 2011-11-29 15:30:34 · 635 阅读 · 0 评论 -
uva 10163 Storage Keepers
题意:有n个仓库(最多100个),m个管理员(最多30个),每个管理员有一个能力值P(接下来的一行有m个数,表示每个管理员的能力值),每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,...),每个月公司都要给看管员工资,雇用的管理员的工资即为他们的能力值p和,问,使每个仓库的安全值最高的前提下,使的工资总和最小。输出最大安全值,并且输原创 2011-11-27 19:24:11 · 1154 阅读 · 0 评论 -
uva 10069 Distinct Subsequences
题意:给你t组字符串,要你找出第二个字符串在第一个字符串中有多少个(只要第二个字符串的任意一个字符在第一个字符串中的位置不一样就可以。)起先用int WA了,用long long WA了,后来去看网上代码,自己写了一个大数类。。。奇葩~#include #include #include using namespace std;#define base 1000000000con原创 2011-11-28 18:31:47 · 1426 阅读 · 0 评论 -
uva 10817 Headmaster's Headache
题意:有一个学校想要聘请老师,要求每个学科都有两个以上的老师授课,并且要使总费用最小。有S(最多8个)个学科,现任的M(最多20个)个老师(你必须继续聘请他们),N(最多100个)份申请。后来的M行每行有至少两个整数,表示现任的老师的工资,和他所教授的课程(可能不止一个)。再后来的N行每行有也有至少两个整数表示聘请这个老师所需的费用,以及他所教授的课程(可能不止一个)。三个0表示输入结束。原创 2011-11-27 15:22:58 · 963 阅读 · 0 评论 -
uva 10599 Robots(II)
题意:给你一个n*m的矩阵,然后给你k个坐标(以0,0结束)表示上面有物品,然后有一个机器人只能往右走和往下走,起点在左上角,终点在右下角,问你,机器从起点到终点最多能拿起多少个物品。前面要输出有多少种路径,并给出其中一种路径(用物品的坐标表示),我们可以抽象成有多少个非降子序列我的思路是:求最长上升子序列的时候,用一个矩阵表示,当我们要放入一个物品时候,我们先从当前已经得到的最长的上升子序列原创 2011-11-26 00:41:53 · 1012 阅读 · 0 评论 -
uva 11008 Antimatter Ray Clearcutting
题意:你手中有一激光枪,能使你当前方向上的树全部砍倒。第一行t组测试数据。每一组测试数据,开始由两行构成,分别表示有n棵树,你要砍倒m棵树,接下来的n行给出的是n棵树的坐标(坐标范围是-1000到1000)。问你最少需要几枪才能达到。我的做法是选两个点枚举所有的方向,跪了近三 秒,差点T,不过很可能T,如果RP不好的话。。。#include #include #include usi原创 2011-11-25 22:52:29 · 821 阅读 · 0 评论 -
uva 10604 Chemical Reaction
题意:有t组测试数据。每组测试数据开始有一个整数n,表示有n种试剂(最多6种)。接下来的n*n行列出来了每种试剂混合产生的化合物以及放出的热量。然后一个整数m,代表有m个试管(最多10个)。接下来一行有m个数,表示m个试管里分别装了哪几种试剂。问怎么组合能产生最少的热量。测试样例之间用/分开,结果用.表示定义了六维的状态直接跑。。。#include #include #原创 2011-11-25 09:42:14 · 2023 阅读 · 3 评论 -
uva 11258 String Partition
题意:给你t组测试数据,每组数据由一串不超过200个字符的字符串构成,问把它们分成不超过int类型的数,组合起来最大是多少?#include #include #include using namespace std;#define LL long longconst int N=205;const LL limit=((LL)1<<31)-1;char str[N];LL m原创 2011-11-26 00:34:02 · 1159 阅读 · 0 评论 -
uva 10723 Cyborg Genes
题意:有t组测试数据,每组测试数据有两个DNA,目标串为能保持两个给出的DNA的相对序列且为最小长度的串,并且要输出有多少种构造方法。第一值可以通过求两个字符串的最长公共子序列,然后把两个字符串的长度加起来减去就可以了。重要的是第二值,当我们用DP去求时, 要注意终点。设当前状态两个字符串的剩下长度分别为x,y.而目标序列剩下的长度为len,如果当x==0||y==0,也就是说两个字符串中原创 2011-11-26 00:04:10 · 1264 阅读 · 0 评论 -
uva 607 Scheduling Lectures
题意:有n个主题。每堂课的时间是L。每个主题各要求t1,t2,...tn(11.每个主题必须完整地包含在一堂课里。不能分成两部分教。2.主题之间的顺序不能调换,即主题i必须在主题i+1之前教。同时,如果在每堂课的最后如果能留有10分钟以内的时候,那么学生的不满意程序是最小的。不满意程度的计算如下所示:D=0(如果剩下的时间是0)。D=-c(如果剩下的时间在10分钟以内)。D原创 2011-11-25 08:59:48 · 1309 阅读 · 0 评论 -
uva 10118 Free Candies
题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果,那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走多少对糖果。糖果种类最多20种.定义了四维的状态去跑。当然也可以定义五维的状态去跑#include #include #include using namespace std;con原创 2011-11-24 17:06:41 · 1626 阅读 · 0 评论 -
uva 10626 Buying Coke
题意:题意:有t组测试数据。每组测试数据有4个数据,分别表示要买几瓶可乐,分别有多少个价值为1,5,10的硬币。每瓶可乐价值为8。问最少需要给自动贩卖机投多少枚硬币。注意,投入硬币后,自动贩卖机会用最少的硬币数给你多的钱。如果我们开四维的数组,是开不下的,考虑到买了一听可乐之后,价值总是下降的(虽然它的硬币组合是不同的),所以这个状态可以不用记录,只用来判断什么时候结束。注意有一个转移,如果投原创 2011-11-24 16:23:47 · 1399 阅读 · 0 评论 -
uva 662 Fast Food
题意:有n家餐馆,有m个仓库,然后后来有n个数字,代表了每个餐馆的坐标,0,0表示结束。求餐馆到离它最近仓库的距离和最小,注意仓库都是建立在餐馆上的。输出的时候,要把每个仓库离它最近的餐馆输出。数据范围是餐馆的数目是200。仓库的数目是30个。如果是x,y之间的餐馆的个数奇数,那么中位数无疑是放仓库的最佳位置,如果是偶数,那么中间两个都可以,因为它们的与到其他餐馆的距离和是相等的。先求出dat原创 2011-11-24 15:51:49 · 1169 阅读 · 0 评论 -
uva 10564 Paths through the Hourglass
题意:给你一个2*n-1行的沙漏,要你找出有多少条路径上的权值和为s(只能由上一层走向下一层的与它最近的两个位置)。并输出一条字典序最小的路径,注意路径的开头是第一行的下标。然后随后都用向左走L或向右走R表示。定义了三维的数组,表示在x,y位置到达k状态有多少种路径。反向跑这个沙漏,因为这样到最后一行时即可以得到有多少条路径,又可以方便判断起始位置。注意三维的数组要用long long原创 2011-11-23 21:42:03 · 1351 阅读 · 2 评论 -
uva 10404 Bachet's Game
题意:给你n个石头,有m种拿石头的方法,问是先手胜,还是后手胜。用一个数组dp[i]表示当前的状态是必胜态还是必败态。设0表示必败,那么dp[0]=0,如果当前状态可能到达一个为0的状态,那么当前这个状态就是必胜态,因为为0的状态只可能是是全部为1的状态推来,即全部是必胜态推出。#include #include #include using namespace std;const原创 2011-11-29 21:30:14 · 872 阅读 · 0 评论 -
uva 10891 Game of Sum
题意:给你n(最多100)个数,有A,B两个人,两个人都可以从这些数的左右两个边界取数,A先取,如果两个都是按最优策略取,那么最后A的分数比B的多多少.定义状态map[x][y][z]表示从x到y这段石子,z(0或1表示当前A取,或B取)能得到的最多的分数。则状转移成,在x与y这个范围内的值的和减去在x和y在这个范围内z^1能取得的最多的分数,#include #include #原创 2011-11-29 18:07:34 · 1360 阅读 · 0 评论 -
uva 10617 Again Palindrome
题意:给你n个串(最长不超过60),问有多少种删去字符的方法使剩下的字符成为一个回文子串。设map[x][y]为从x到y有多少个回文串。当str[x]==str[y]的时候,我们要考虑x+1,y组成的回文串,x,y-1之间的回文串,但是两者都会计算x+1,y-1的回文串数,所以要减去,另外,因为str[x]==str[y],所以x+1,y-1之间的回文串也能和str[x],str[y]组成原创 2011-11-29 22:38:54 · 2197 阅读 · 0 评论 -
POJ 3162 Walking Race(单调队列或线段树加树型DP)
题意:给你一棵有n个节点的树,树边为权值,要你求出树上每个点到其他点的距离中最大的那个值。对求出的从节点1到节点n最大值,找出最长的一段使得这一段中最大值减最小值的结点小于等于m。对于第一个问题,有两种方法可以解决。第一种比较简单的方法是,每个点到其他点的距离中最大的那个值,一定是到树的直径的两个端点的距离之一(反证法易得)。那么我们找出树的直径的同时,处理出各个节点到树直径两个端点的距离就可原创 2012-10-24 01:13:52 · 2481 阅读 · 0 评论 -
hdu 2242 考研路茫茫――空调教室(Tarjan+树型DP)
题意:给你N个点,M条无向边,并且每个点有一个权值,问把哪条边去掉,能使图分成两个部分,并且这两个部分的权值差最小。跑一次Tarjan转化成一棵树,然后跑一次树型DP(特别注意重边的处理)。#include #include #include #include using namespace std;const int N=10005;struct Edge{ i原创 2012-10-24 20:50:32 · 2873 阅读 · 0 评论 -
POJ 1155 TELE(树型DP)
题意:有一个电视台广播节目,广播的网络用一棵树表示,节点1表示电台,叶子结点表示用户,用户愿意付一定的钱去收看这个节目,从非叶子结点到其他结点需要一定的费用(即从中继点到另一个中继点需要一些钱),问最后在不亏本的情况下,最多能使多少人收看到节目。定义dp[i][j]表示在节点i为根节点的子树下,有j个人收看节点的最大利润。状态转移方程是:dp[i][j]=max(dp[i][j],dp原创 2012-10-24 00:56:48 · 1643 阅读 · 0 评论 -
POJ 2486 Apple Tree(树型DP)
题意:给你一棵树,树上的每个节点都有权值,从一个节点到另一个节点需要的步数是1,问从节点1开始,给你步数为K,问能得到的最大权值是多少。定义dp[i][j][0]表示从节点i出发能走j步最后不回到i点能得到的最大权值是多少。定义dp[i][j][1]表示从节点i出发能走j步最后回到i点能得到的最大权值是多少。那么状态转移方法就可以知道了,如果还要回到u点,从节点u转移到节点v就需要两步原创 2012-10-24 00:51:41 · 760 阅读 · 0 评论 -
ZOJ 3613 Wormhole Transport(DP 斯坦纳树)
题意:有n个星球,其中有些星球上有多个工作,有些星球上有些资源(但是一个星球上的资源只能提供给一个工厂),知道在一些星球边建立边的代价,问使得得到资源的工厂的数目最多的多少,在些前提下代价最小是多少。还是斯坦纳树,不懂看:http://endlesscount.blog.163.com/blog/static/821197872012525113427573/#include #incl原创 2012-10-21 22:19:09 · 1875 阅读 · 0 评论 -
CF 108E Garden(DP,斯坦纳树)
题意:给你一个n*m的矩阵,和k个点,要求使这k个点相互连接,并且使连接的代价最小(每个矩阵上都有一个权值,如果权值为0表示k个点其中的一个,连接的代价等于将这些点连接起来的路径上的权值和。) 简单的斯坦纳树,只要要要多开一个数组记录路径。如果不懂斯坦纳树,看http://endlesscount.blog.163.com/blog/static/821197872012525113427原创 2012-10-21 21:15:33 · 1184 阅读 · 0 评论 -
HDU 4085 Peach Blossom Spring(DP,斯坦纳树)
题意:给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价,从前k个点中任取一个使其和后k个点中的某一个点,通过边连接,并且必须是一一对应,问最小的代价是多少。 同样是斯坦纳树,不过最后得到的答案可能是森林,所以最后要跑一个DP。如果不懂斯坦纳树,看:http://endlesscount.blog.163.com/blog/static/8211978原创 2012-10-21 21:18:48 · 3455 阅读 · 0 评论 -
hdu 4293 Groups
题意:有 n 个人,可任意分成若干组,然后每个人各提供一个信息,表示他们组前面有多少个人,后面有多少个人。问最多有多少个信息是不冲突的。可以用DP,也可以转化成求最长路。DP,设这n个人的编号是从1到n,则每个的提供的信息可以转化成一段区间[a+1,n-b]。那么问题就可以转化成有最多有多少个区间是互不相交的。将区间按终点排序后跑DP。dp[i]=max(dp[j]+num[i]) (0原创 2012-09-21 20:22:18 · 918 阅读 · 0 评论 -
hdu 4055 Number String
题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果第i字符是‘I’表示排列中的第i-1个数是小于第i个数的。如果是‘D’,则反之。定义dp[i][j]表示在这个排列中第i个数字以j结尾的,满足条件的子排列有多少个。如果第i个字符是‘I’,那么明显可以得到dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+……+dp[i-1][1]。如原创 2012-09-15 22:45:12 · 2409 阅读 · 2 评论 -
hdu 4276 The Ghost Blows Light(树型DP)
题意:给你n个点,n-1条边构成树,每条边有边树,每个点有点权(表示走每条边的时间),问在时间T从点1走到点n,能够得到最多的点权有多少。树型DP。先用spfa跑出从点1到点n的最短路。如果这最短的时间已经超过T,那么就是无法完成的。容易知道,最短路径上的边只会经过一次且必须经过一次,而其他边会经过两次。将最短路径上的边的权值赋值为0,使得DP的过程一定会经过这些边。剩下的就是树型DP的问题了原创 2012-09-11 21:39:13 · 1879 阅读 · 0 评论 -
ZOJ 3632 Watermelon Full of Water(单点更新,区间查询)
题意:有n天,每天都可以买西瓜,每个西瓜的价格是ai,每个西瓜能吃bi天。问这n天每天都有西瓜吃的最小的代价是多少?如果你在第i天买了一个西瓜,那么之前买的西瓜就要全部扔掉,才能开始吃新的西瓜。定义dp[i]为到i天为止,每天都有西瓜吃的最小代价,那么状态转移方程就是:dp[i]=min(dp[i],dp[i-k-1]+a[i-k])。这样时间复杂度会达到O(n^2),所以要优化。在递推的过程原创 2012-08-06 11:01:16 · 1597 阅读 · 1 评论 -
ZOJ 3626 Treasure Hunt I(树型DP+01背包)
题意:给一棵有n个结点的树,每个点有点权表示在这个点上的价值,每条边有边权表示走这条路所需要的时候,给一个时间m,问在时间m从点k出发再回到点k所能得到的最大的价值和。#include #include #include using namespace std;const int N=105;int n,m,k;int data[N],head[N],tot;int dp[N][原创 2012-08-06 11:47:37 · 1282 阅读 · 0 评论 -
uva 10913 Walking on a Grid
题意:有一个大小有N(最多75)的方格,要你从(1,1)走到(n,n)。有如下规则:你只有三个方向,左、右、下。不能走出方格。一个方格只能走一次。你要保证你的路径上的格子的和最大。你最多只能走k(最多为5)个负权值的格子,从起点到终点。要注意,因为可以向右走,所以定义三维状态可能有问题,所以定义了四维,表示从当前点向左右下走能得到的最大的值。#include #include #i原创 2011-11-30 19:51:00 · 1849 阅读 · 0 评论 -
uva 10453 Make Palindrome
题意:给你n个串(长度最多为1000),问对于每个串插入最少多少m个字符能使它变成一个回文串。输出m,并把回文串输出.看了解题报告。总结,还要随便用memset,否则会T。#include #include #include using namespace std;const int N=1005;struct node{ int cost,cmd; int x原创 2011-11-30 16:39:30 · 1674 阅读 · 0 评论 -
uva 10271 Chopsticks
题意:有t组测试数据,要你选出n+8对三元组(从m个数中)。要求这三个数x设map[i][j]是从前j个数中选出i对三元组的最小的代价。可以有如下的状态转移方程:map[i][j]=min(map[i][j-1],map[i-1][j-2]+bad[j]);问题是z如何安排,当我们把数从大到小去排,然后加上限制条件i*3#include #include #include原创 2011-11-30 11:16:32 · 2034 阅读 · 0 评论 -
uva 10911 Forming Quiz Teams
题意:给你2*n个点,问它们两两组合,使每对的距离加起来最小。状态压缩。#include #include #include #include using namespace std;#define eps 1e-8#define INF 1000000000000const int N=70000;int n;double map[N];bool vis[N];do原创 2011-11-23 09:36:36 · 886 阅读 · 0 评论 -
uva 10401 Injured Queen Problem
题意:受伤的皇后只能攻击它这一列的,和它周围的九个格子,题目给出一个字符串,如果第i个字符是?则表示皇后能放在任意位置,如果不是?则表示它指定了必须放在哪一行。问有几种放法。#include #include #include using namespace std;#define LL long longconst int N=20;bool vis[N][N];int n,f原创 2011-11-23 08:44:19 · 1040 阅读 · 0 评论 -
uva 10465 Homer Simpson
题意:背包大小有t,有两个物品,m,n问你在尽量使背包装爱满的情况下,可以放多少个物品。#include #include #include using namespace std;int imax(int a,int b){return a>b?a:b;}int dp[10005];int main(){ int n,m,t; while(scanf("%d%d原创 2011-10-22 20:32:08 · 675 阅读 · 0 评论 -
uva 531 Compromise
题意:寻找两个句子的最长公共子序列。#include #include #include using namespace std;char str1[105][35],str2[105][35],ans[105][35];int map[105][105],change[105][105];int main(){ int n1=0,n2=0; while(scan原创 2011-10-22 19:02:42 · 529 阅读 · 0 评论 -
uva 10130 SuperSale
题意:有t组测试数据,有N(1#include #include #include using namespace std;int dp[30005];bool vis[30005];struct node{ int x,y;}coin[1005];int main(){ int t; scanf("%d",&t); while(t--)原创 2011-10-22 18:32:24 · 621 阅读 · 0 评论 -
uva 562 Dividing coins
题意:给你n个硬币,和n个硬币的面值。要求尽可能地平均分配成A,B两,输出A,B差的绝对值。#include #include #include using namespace std;int coin[105];bool dp[51005];int main(){ int t; scanf("%d",&t); while(t--) {原创 2011-10-20 21:32:11 · 1381 阅读 · 0 评论 -
uva 357 Let Me Count The Ways
题意:给你50,25,10,5,1这五个硬币,问,有多少种方案组成金额n。#include #include using namespace std;int coin[5]={50,25,10,5,1};long long map[30005][6];long long dp(int,int);int main(){ int n; while(scanf("%d"原创 2011-10-20 16:34:04 · 658 阅读 · 0 评论