动态规划
Joyyiwei
这个作者很懒,什么都没留下…
展开
-
UVA - 111 History Grading
题意:最长公共子序列#include #include #include #include using namespace std;int arr[25],brr[25],dp[25][25];int main(){ int n,t; scanf("%d",&n); for (int i = 1; i <= n; i++){ scanf("%原创 2013-09-06 13:13:16 · 721 阅读 · 0 评论 -
UVA - 103 Stacking Boxes
题意:n维向量,如果向量A,B每一位上的数A都比B大,则A可以嵌套住B,求最大的嵌套个数,并输出依次是第几个。思路:构成一个有向图DAG,如果X可以嵌套在Y里,那么X到Y就有一个有向边,最后就是求DAG上的最长路径#include #include #include #include using namespace std;int G[32][32],arr[32][32],d[3原创 2013-09-06 18:08:37 · 753 阅读 · 0 评论 -
UVA - 10405 Longest Common Subsequence
题意:求最长公共子序列#include #include #include #include using namespace std;const int MAXN = 1005;char arr[MAXN],brr[MAXN];int dp[MAXN][MAXN];int main(){ while (gets(arr)){ gets(brr);原创 2013-09-06 18:27:32 · 637 阅读 · 0 评论 -
UVA - 674 Coin Change
题意:用给你的五种硬币凑出n,求有几种方法,跟DAG本质上是一样的,同样是先建图,那这题的简单之处是已经给好我们硬币价值, dp[i] 表示凑出i有几种方法#include #include #include #include using namespace std;const int MAXN = 8000;int dp[MAXN],n;int coin[5] = {50,2原创 2013-09-06 19:07:53 · 737 阅读 · 0 评论 -
UVA - 10003 Cutting Sticks
题意:求最小的代价将木棍剪成n+1根,代价是之后两根的长度,起初我是想如果能知道剪成两端的最小代价,那么我们就可以依次类推下去,最后总代价一定是最小的,但后来发现这是错的,这题并不是贪心,我们不能保证这一步是最优的,且它的下一步比其他可能的下一步更优,从而是总代价最优,所以我们不如反过来想一下,如果我们每次都将最优的拼在一起,递推上去是可以保证最后的答案是最优的,但问题是怎么表达呢,我们可以用dp原创 2013-09-06 20:19:52 · 765 阅读 · 0 评论 -
uva 116 Unidirectional TSP
题意:数塔的变形,求最小的代权,第一行是可以连到最后一行的,用path[i][j]储存(i,j)下一步的方向,还有是要按字典序输出,也就是说当最小值相等的时候选择字典序较小的路径#include #include #include #include #include using namespace std;const int MAXN = 205;const int INF =原创 2013-09-09 20:38:56 · 801 阅读 · 0 评论 -
UVA - 10131 Is Bigger Smarter?
题意:求最长上升子序列,因为题目是从一群大象中尽量多选出大象使得,体重递增,IQ递减,我们可以事先排序 ,接着就是在求最长上升子序列的同时,注意IQ递减,然后再循环一次输出选择的大象标号#include #include #include #include using namespace std;const int MAXN = 1010;struct eleph {原创 2013-09-09 23:03:23 · 822 阅读 · 0 评论 -
UVA - 10066 The Twin Towers
题意:求最长公共子序列#include #include #include #include using namespace std;const int MAXN = 110;int arr[MAXN],brr[MAXN],dp[MAXN][MAXN];int main(){ int x,y,t=1; while (scanf("%d%d",&x,&y) != E原创 2013-09-10 00:18:43 · 992 阅读 · 0 评论 -
UVA - 10192 Vacation
题意:求最长公共子序列,在输入的地方纠结的好久#include #include #include #include using namespace std;const int MAXN = 110;string str1,str2;int dp[MAXN][MAXN];int main(){ int t = 0; while (getline(cin,st原创 2013-09-10 12:26:31 · 696 阅读 · 0 评论 -
UVA - 357 Let Me Count The Ways
题意:还是凑钱问题#include #include #include #include using namespace std;const int MAXN = 30005;int money[5] = {1,5,10,25,50};long long dp[MAXN];int main(){ memset(dp,0,sizeof(dp)); dp[0]原创 2013-09-10 19:26:54 · 736 阅读 · 0 评论 -
UVA - 562 Dividing coins
题意:求将硬币分成差最小的两份,输出差值,这题与凑硬币不同的地方是,每个硬币只有一个,所以我们从sum / 2 开始凑#include #include #include #include using namespace std;const int MAXN = 110;int arr[MAXN],dp[MAXN*550];int n;int main(){ int t原创 2013-09-10 20:49:45 · 746 阅读 · 0 评论 -
UVA - 147 Dollars
题意:输出组合的方法种数,将单位同一就可以了#include #include #include #include using namespace std;const int MAXN = 30005;long long dp[MAXN];int money[11] = {5,10,20,50,100,200,500,1000,2000,5000,10000};int mai原创 2013-09-10 19:06:45 · 681 阅读 · 0 评论 -
UVA - 348 Optimal Array Multiplication Sequence
题意:矩阵连乘问题#include #include #include #include using namespace std;const int MAXN = INT_MAX;int n;struct node{ int a,b;}arr[15];int dp[20][20];int p[20][20];int Mark(){ for (int i原创 2013-09-12 20:12:32 · 726 阅读 · 0 评论 -
UVA - 624 CD
题意:重量和价值相同的01背包问题,用path[i][j]保存第i个物品放入重量为j的时候价值最大#include #include #include using namespace std;const int MAXN = 10005;int w,n,arr[25],dp[MAXN];bool path[25][MAXN];int main(){ while (原创 2013-09-12 21:24:41 · 708 阅读 · 0 评论 -
UVA - 10130 SuperSale
题意:多次的背包问题#include #include #include using namespace std;int main(){ int t,dp[40]; scanf("%d",&t); while (t--){ int p,w; memset(dp,0,sizeof(dp)); int n;原创 2013-09-12 23:09:20 · 683 阅读 · 0 评论 -
UVA - 531 Compromise
题意:求最长公共子序列,打印路径,用path[i][j]保存状态,注意输出格式#include #include #include #include using namespace std;const int MAXN = 110;char str1[MAXN][35],str2[MAXN][35];int dp[MAXN][MAXN],path[MAXN][MAXN];v原创 2013-09-13 09:20:58 · 697 阅读 · 0 评论 -
UVA - 10285 Longest Run on a Snowboard
题意:求最长的滑雪长度,只有当当前的高度大于下一步的高度的时候才能划到哪里,我们可以从头开始dp,顺便记录结果,#include #include #include #include using namespace std;const int MAXN = 110;int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};int G[MAXN][原创 2013-09-13 18:50:45 · 735 阅读 · 0 评论 -
UVA - 10404 Bachet's Game
题意:给n个石头,m 种取法,Stan先取,Ollie后取,取到最后一块的获胜,问谁赢了,首先我们想想怎么能让Stan获胜,一定是Ollie取完后,我们可以通过m种取法中的一种使得Stan拿到最后一块,那么我们用dp[i] = 1表示Stan赢,0为输,那么一定有dp[n-arr[i] ] == 0,那么Stan 就赢了,推广到一般的情况是只要dp[i-arr[j]] == 0,那么我们就可以说在原创 2013-09-13 21:01:54 · 693 阅读 · 0 评论 -
UVA - 10465 Homer Simpson
题意:在尽量让时间步浪费的情况下使得吃的汉堡最多贪心:#include #include #include using namespace std;const int MAXN = 10005;int dp[MAXN],num[MAXN];int main(){ int m,n,t; while (scanf("%d%d%d",&m,&n,&t) != EO原创 2013-09-13 17:19:24 · 977 阅读 · 0 评论 -
UVA - 437 The Tower of Babylon
题意:输入一些砖头,每种有若干个,如果一块砖的长和宽都小于另一块的长和宽的话,那么这块砖就可以叠在另一块的上面,每块砖头可以任意摆放,求最高是多少,其实就是在按底面积的大小排序,然后就最长上升子序列,每块砖头有6种情况#include #include #include #include using namespace std;const int MAXN = 220;s原创 2013-09-13 19:39:13 · 867 阅读 · 2 评论 -
UVA - 620 Cellular Structure
题意:唉,只要理解题意就会很简单了,看了别人的题解明白了,思路:所谓的上下文无关文法就是给定几个算术表达式,然后通过一些相关的变化,可以推出另一个表达式。回到题目,由图片可以知道, O = BOA,我们把BOA中的O看做一个表达式,这里O可以看做O = A | OAB | BOA,由此可知:OAB推出的子串 OABAB, OABABAB,....AB的最后两位一定是AB。①同理原创 2013-09-13 21:32:14 · 722 阅读 · 0 评论 -
UVA - 10604 Chemical Reaction
有m种化学药品(m#include #include #include #include using namespace std;const int INF = 1<<30;int m,k,t[12],r[10][10],w[10][10],map[10][10][10][10][10][10];int vis[10][10][10][10][10][10];int dp(原创 2013-09-29 16:07:33 · 735 阅读 · 0 评论 -
UVA - 825 Walking on the Safe Side
题意:求从坐标(1,1)到(n,m)的路径数,有些地方是不能走的,输入有点麻烦而已,只能走右或下,所以动态转移方程就很简单了dp[i][j] = dp[i-1][j] + dp[i][j-1]#include #include #include using namespace std;const int MAXN = 1010;char str[MAXN];int n,m,G原创 2013-09-14 21:51:56 · 659 阅读 · 0 评论 -
UVA - 10069 Distinct Subsequences
题意:求一个串的子串出现在母串的个数,,i表示子串的长度,j表示母串的长度,当str1[i] != str[j],dp[i][j] = dp[i][j-1],因为如果这两个字符不相等的话,那么就等于子串与长度为j-1的母串的情况,当str1[i] == str[j]。那么dp[i][j] = dp[i][j-1]+dp[i-1][j-1],相等的话,那么就等于与长度为j-1的母串的个数加上dp[i原创 2013-09-15 11:19:01 · 613 阅读 · 0 评论 -
UVA - 10051 Tower of Cubes
题意:一些每个面都有不同颜色的立方体,要求在上面的立方体的底面颜色和它下面的立方体的顶面颜色相同,且重量递增的情况下,求最高能达到多少,并输出从顶至下的顶面颜色,将六个面的情况都保存下来,求最长的上升子序列#include #include #include using namespace std;const int MAXN = 3005;char face[6]原创 2013-09-16 14:47:37 · 715 阅读 · 0 评论 -
UVA - 10534 Wavio Sequence
题意:给你n个数,定义当前节点向左的最大下降子序列为L1,向右的最大下降子序列为L2,求min(L1,L2)*2 -1的最大值,我们可以分别从前和后求最长上升子序列 ,然后比较就好了,用到了最长上升子序列的O(nlogn)算法,这个算法大概是:我们对一个数组从左往右扫描,建立一个栈,如果当前的a[i]是大于栈顶的数,那么直接压入栈中,否则从栈底找第一个大于等于a[i]的数并代替这个数,这并不会影响原创 2013-09-16 12:11:04 · 676 阅读 · 0 评论 -
UVA - 10651 Pebble Solitaire
题意:大意是“-oo”可以变成“o--”,"oo-”可以变成“--o”,问最后最少还剩多少,看到只有两种状态的就用位运算比较简单1代表“o”,0代表“-”,模拟一下就出来了#include #include #include #include using namespace std;const int MAXN = 5000;int dp[MAXN];int dps(in原创 2013-09-16 20:04:10 · 702 阅读 · 0 评论 -
UVA - 10306 e-Coins
题意:给你n个硬币,每个硬币有两个值x,y,求最少的组合使得(x1+x2..)^2 + (y1+y2...)^2 = m^2,令dp[i][j]代表凑出x总和为i,y总和为j的最少组合,然后就是找出最小的满足要求,不知道为什么用memset(dp,INF,sizeof(dp))会出错#include #include #include #include using namespac原创 2013-09-17 22:39:06 · 630 阅读 · 0 评论 -
UVA - 590 Always on the run
题意:给你n个城市,k天时间,要你第k天到n城,难懂的题意啊,还是看了别人的解释,注意price[j][i][x]代表的是从j到i的第x天的价格,是从第一天就开始循环的,从一个城市到达一个城市默认是一天,状态转移方程倒是不难推。dp[i][j]代表第j天到i城价格最小,那么dp[i][j] = min(dp[i][j],dp[d][j-1]+price[d][i][x]),dp[1][0] = 0原创 2013-09-17 20:20:10 · 763 阅读 · 0 评论 -
UVA - 10739 String to Palindrome
题意:求最少的操作数使得字符串成为回文串,有删,添,替换,添加和删除其实是一样的,所以我们可以认为只有两种方法,那么dp[i][j]代表从i到j是回文串,如果str[i] = str[j],那么dp[i][j] = dp[i+1][j-1],如果进行删除那么dp[i][j] = min(dp[i+1][j],dp[i][j-1])+1,替换的话就是dp[i][j] = dp[i+1][j-1] +原创 2013-09-18 11:59:03 · 617 阅读 · 0 评论 -
UVA - 10913 Walking on a Grid
题意:求在经过的负数不超过K的情况下,从左上角到右下角的最大权值和,方向有左,右,下。思路:跟数塔类似的思想,如果我们能够知道在满足条件的多个倒数第二的话,我们就可以得到最后一步的最大值,所以用四维空间记录状态,重要的一点是不能重复以前的路,就是不能从左来,有走回左边去,DP到最后一行的时候显然只能一直往右走,才能到达目标,INF表示无法走到的坐标#include #include #原创 2013-10-04 14:34:15 · 703 阅读 · 0 评论 -
UVA - 11008 Antimatter Ray Clearcutting
题意:给你n棵树,还有要打掉m棵树,每次都是打掉这条直线上的所有树,求最少要几枪,没想到用二进制的话是很简单的,用S表示树的状态,1表示在,0表示砍掉了,s[i][j]表示这条直线上的所有的树,我们只要DP到(n-m)就可以#include #include #include #include using namespace std;const int MAXN = 20;cons原创 2013-10-04 21:36:11 · 575 阅读 · 0 评论 -
UVA - 10304 Optimal Binary Search Tree
题意:给定一个序列S= (e1, e2, ..., en),将这些序列构成一个二叉搜索树,要求按深度*频率的总权值最小,根节点深度为0,跟矩阵连乘相似,显然这题具有最优子结构,所以我们假设dp[i][j]表示从(i,j)构成的搜索树最小是多少,然后便模仿矩阵连乘的思路,枚举每一个点作为根节点,接着就是确定状态转移方程了,当我们确定k为节点的时候,那么序列(k1,...,k-1)作为左子树的深度加1原创 2013-09-18 19:14:26 · 673 阅读 · 0 评论 -
UVA - 10271 Chopsticks
题意:从n个筷子中选出k+8对(x,y,z)使得总的(x-y)^2最小,切z最大,容易想出dp[i][j]表示前i个筷子中选j对使得权值最小,先确定最终的状态是我们用n个筷子选出k+8组使得权值最小,对于第i个筷子我们有选与不选的情况,当我们选的时候dp[i][j] = dp[i-1][j],选的话那么就是一定要连着i-1这根一起选,所以dp[i][j] = dp[i-2][j-1]+权值,所以原创 2013-09-18 23:07:25 · 721 阅读 · 0 评论 -
UVA - 10617 Again Palindrome
题意:只通过删除,问可以弄成多少的回文串,跟之前的一题是相似的,对于str[i] = str[j]的情况,如果我们步删除的话dp[i][j] = dp[i+1][j-1] +1,如果删除str[i]的话,dp[i][j] += dp[i+1][j],相似的还有dp[i][j] += dp[i][j-1],除去相同的dp[i+1][j-1],#include #include #incl原创 2013-09-19 10:11:44 · 530 阅读 · 0 评论 -
UVA - 11137 Ingenuous Cubrency
题意:完全背包问题版的凑硬币#include #include #include const int MAXN = 10010;long long dp[MAXN];int arr[22],n;void init(){ memset(dp,0,sizeof(dp)); dp[0] = 1; for (int i = 1; i < 22; i++)原创 2013-09-20 18:48:04 · 644 阅读 · 0 评论 -
UVA - 10201 Adventures in Moving - Part IV
题意:在100升为初始的车,求到达终点的最小花费,路上有加油站,分别给你离起点的距离和每升油的价格,没升油走一公里,在选与不选做动态规划#include #include #include #include #include using namespace std;const int MAXN = 205;const int INF = 1<<29;int n,dp[MAXN原创 2013-09-21 00:51:07 · 737 阅读 · 0 评论 -
UVA - 11258 String Partition
题意:在给出的字符串中,分成若干个串,求最大的和是多少,单个数字不能超过int 的最大值,d[i]表示前i位的最大和,枚举每一位,还有就是位数最大不超过10#include #include #include #include using namespace std;const int MAXN = 205;const int INF = INT_MAX;long long原创 2013-10-05 22:41:02 · 632 阅读 · 0 评论 -
UVA - 10817 Headmaster's Headache
题意:弄了好久,看了学长的题解,还是有点不明白初始化的地方。。。参考:点击打开链接#include #include #include #include using namespace std;const int MAXN = 150;const int INF = 1<<30;int courseNum,m,n,sum;int maxState;int f[1<<8]原创 2013-10-06 23:10:34 · 788 阅读 · 0 评论 -
UVA - 10453 Make Palindrome
题意:跟之前删除,添加,替换转化成回文串一个意思,还是从后往前枚举,最后根据dp[i+1][j],dp[i][j-1]的大小,我们就可以判断是添加在哪一边了,如果dp[i+1][j]大的话,那么果断是复制s[l]在最右边,因为不相等的话我们肯定要添加一个,当然要找最小的啦,另一种情况就复制s[r]在最左边,打印的时候注意如果有中间的字符的时候要记得打印就行了#include #include原创 2013-09-21 22:07:00 · 699 阅读 · 0 评论