第九章
紫书
JILIN.
roo
展开
-
例题 9-27 方块消除(Blocks, UVa10559)
先将最右边同色的特意挑选出来,得到p∈[i,j]中最左边的使得a[p]=a[p+1]=…=a[j]的值,即从右边界j位置往左到p位置是同色的最长段。如果[i,p-1]段中仍有与a[j]同色的段,可以找到q满足q原创 2022-07-17 10:01:03 · 863 阅读 · 1 评论 -
例题 9-26 一个调度问题(A Scheduling Problem,UVa1380)
原题链接:https://vjudge.net/problem/UVA-1380分类:树形DP备注:树的性质题意:每次输入是一棵树,其中有有向边和无向边。根据拓扑顺序将树上的点全部消除,也就是入度为0的点才能被消除,问最少需要几步能消除完所有点。同时注意,无向边连接的两个点不能同时被消除。因此问题可以转化为对每一条无向边选择一个方向来对点进行消除。因为是树的结构,所以答案的范围很特殊。设忽视无向边时的最长有向链的边数为k(边数为节点数-1),那么把无向边定好方向后答案必定是k+1或k+2。在紫书中是这么原创 2022-07-03 18:36:55 · 357 阅读 · 0 评论 -
习题 9-2 免费糖果(Free Candies,UVa 10118)
原题链接:https://vjudge.net/problem/UVA-10118分类:记忆化搜索备注:状态分析#include <bits/stdc++.h>using namespace std;int n, pile[4][45], pos[4], dp[45][45][45][45], hav[25];int dfs(int cap) {// printf("%d %d %d %d, cap = %d\n", pos[0], pos[1], pos[2], pos[3]原创 2021-11-10 16:16:09 · 361 阅读 · 0 评论 -
习题 9-1 最长的滑雪路径(Longest Run on a Snowboard,UVa 10285)
原题链接:https://vjudge.net/problem/UVA-10285分类:记忆化搜索备注:水题#include <bits/stdc++.h>using namespace std;const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};char s[105];int t, row, col, g[105][105], d[105][105];bool ok(int r, int c) { retur原创 2021-11-10 15:45:29 · 398 阅读 · 0 评论 -
例题 9-25 轻松爬山(Easy Climb,NWERC 2008,UVa12170)
原题链接:https://vjudge.net/problem/UVA-12170分类:动态规划备注:思维,单调队列#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 200 + 5;const LL INF = 1e18;int t, n, d;LL h[N], x[N * N * 2 + 5], f[N][2 * N * N];struct Node { LL原创 2021-11-10 15:41:26 · 239 阅读 · 0 评论 -
例题 9-24 书架(Bookcase, ACM/ICPC NWERC 2006, UVa12099)
原题链接:https://vjudge.net/problem/UVA-12099分类:动态规划备注:状态优化,类似0-1背包#include <bits/stdc++.h>using namespace std;const int N = 70 + 5;const int INF = 0x3f3f3f3f;int t, n, d[N * 30][N * 30], sum[N];struct Book { int h, t; bool operator < (con原创 2021-11-10 15:34:12 · 432 阅读 · 0 评论 -
例题9-23 有趣的游戏(Fun Game, ACM/ICPC Beijing 2004, UVa1204)
原题链接:https://vjudge.net/problem/UVA-1204分类:动态规划备注:字符串#include <bits/stdc++.h>using namespace std;const int N = 20;const int INF = 0x3f3f3f3f;int n, len[N], cover[N][N][2][2], dp[1 << N][N][2];// dp[s][i][o],其中s表示已经加入的字符串的集合,i表示结尾串的编号,原创 2021-11-10 15:32:34 · 3302 阅读 · 0 评论 -
例题9-22 越大越好 (Bigger is Better, ACM/ICPC Xi‘an 2006, UVa12105)
原题链接:https://vjudge.net/problem/UVA-12105原创 2021-09-23 16:42:06 · 162 阅读 · 0 评论 -
例题 9-23 有趣的游戏(Fun Game,ACM/ICPC Beijing 2004,UVa1204)
原题链接:https://vjudge.net/problem/UVA-1204分类:状压DP备注:字符串覆盖按紫书的思路,首先排除被覆盖的串,每个串都试着正反两个状态,与当前集合的最后一个串计算覆盖量,取最优。这里固定以某一个串为第一个串,就可以很方便地来把最后一个串和第一个串连起来。注意有效串个数为1,以及长度小于等于1应该变为2的情况。#include <bits/stdc++.h>using namespace std;const int N = 20;const in原创 2021-09-23 16:37:57 · 193 阅读 · 0 评论 -
例题 9-21 修缮长城(Fixing the Great WALL, ACM/ICPC CERC 2004, UVa1336)
原题链接:https://vjudge.net/problem/UVA-1336分类:区间DP备注:记忆化搜索注意一定要加floor,否则会WA。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 1010;struct Node { double x, c, d; bool operator < (const Node& rhs) const {原创 2021-08-25 08:31:06 · 244 阅读 · 0 评论 -
例题 9-20 装满水的气球(Dropping water balloons, UVa 10934)
原题链接:https://vjudge.net/problem/UVA-10934分类:动态规划备注:经典问题很奇怪的一道题,但lrj将其备注为经典问题。紫书上说,最少多少次实验能够确定气球的硬度。最坏情况是要测到最后一层也不摔破,但实际不知道硬度,所以我们要在不知道硬度的前提下,测出硬度是大于等于n这件事。显然,如果只有一个气球,要确定硬度,必须从第一层开始往上尝试,否则直接破了就不能确定了。如果气球足够的话,显然二分测是最快的,但主要考虑气球不够的情况。设d[i][j]为i个气球实验j次最高能到原创 2021-08-24 08:18:43 · 341 阅读 · 0 评论 -
例题 9-19 团队分组(Team them up!, ACM/ICPC NEERC 2001, UVa1627)
原题链接:https://vjudge.net/problem/UVA-1627分类:0-1背包备注:二分图,背包变体按照紫书的思路,将不互相认识的连在一起,这样形成连通图必须要能够变为二分图,否则不合题意,然后黑白染色,两种颜色对应两个分组,互换一下分组,组员数量的差值就会变化,可以据此来进行DP。开始以为,只要对每个连通图看两种情况即可,每次都求出最优结果。WA了之后再看别人的解法,仔细一想发现直接这样的状态转移是一种贪心的做法。在洛谷上有一句总结:对付这种“01背包”,常见的状态设定是:用 d原创 2021-08-14 22:34:36 · 242 阅读 · 0 评论 -
例题 9-18 跳舞机(Tango Tango Insurrection,UVa 10618)
原题链接:https://vjudge.net/problem/UVA-10618分类:多维DP备注:多阶段决策问题主要还是参考了别人的解法,但理解起来很容易。#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int INF = 0x3f3f3f3f;// 0-up 1-left 2-right 3-down// 0:neither 1:l原创 2021-08-13 21:54:32 · 178 阅读 · 0 评论 -
例题 9-17 基金管理(Fund Management,ACM/ICPC NEERC 2007, UVa1412)
原题链接:https://vjudge.net/problem/UVA-1412分类:复杂DP备注:复杂状态的动态规划;和指函数有关的状态转移以下代码和紫书代码没有任何区别…#include<bits/stdc++.h>using namespace std;const double INF=1e10;const int maxn=10;const int maxm=105;const int maxstate=15000;double c,price[maxn][maxm]原创 2021-03-22 21:39:28 · 246 阅读 · 0 评论 -
例题 9-16 20个问题(Twenty Questions,ACM/ICPC Tokyo 2009,UVa1252)
原题链接:https://vjudge.net/problem/UVA-1252分类:状压DP备注:集合的应用#include<bits/stdc++.h>using namespace std;int m,n,sta[130],cnt[(1<<11)+5][(1<<11)+5],dp[(1<<11)+5][(1<<11)+5];char c[15];int d(int s,int a){ if(dp[s][a]!=-1)re原创 2021-03-21 21:48:00 · 160 阅读 · 0 评论 -
例题 9-15 校长的烦恼(Headmaster‘s Headache, UVa 10817)
原题链接:https://vjudge.net/problem/UVA-10817分类:状压DP备注:集合的状态变化#include<bits/stdc++.h>using namespace std;const int inf=1<<25;const int maxn=125;const int maxs=10;int s,m,n,c[maxn],st[maxn],d[maxn][1<<maxs][1<<maxs];int dp(int i原创 2021-03-21 00:28:20 · 160 阅读 · 0 评论 -
例题 9-14 完美的服务(Perfect Service,ACM/ICPC Kaoshiung 2006,UVa1218)
原题链接:https://vjudge.net/problem/UVA-1218分类:树形DP备注:树最大独立集变形#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;const int inf=10001;int n,ed,fa[maxn],dp[maxn][3];vector<int>sons[maxn];int d(int u,int o){ if(dp[u][o]!=-1)r原创 2021-03-19 11:08:21 · 201 阅读 · 0 评论 -
例题 9-13 Hali-Bula 的晚会(Party at Hali-Bula,ACM/ICPC Tehran 2006,UVa1220)
原题链接:https://vjudge.net/problem/UVA-1220分类:树形DP备注:树的最大独立集#include<bits/stdc++.h>using namespace std;const int maxn=205;int n,cnt,dp[maxn][2],f[maxn][2];string x,s;vector<int>sons[maxn];map<string,int>id;int d(int u,int o){ i原创 2021-03-19 11:06:31 · 200 阅读 · 0 评论 -
例题 9-12 工人的请愿书(Another Crisis,UVa 12186)
原题链接:https://vjudge.net/problem/UVA-12186分类:树形DP备注:简单推理#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;int n,t;vector<int>sons[maxn];int dp(int u){ if(sons[u].empty())return 1; int k = sons[u].size(); vector&原创 2021-03-18 13:10:11 · 195 阅读 · 0 评论 -
例题 9-11 最大面积最小的三角剖分(Minimax Triangulation,ACM/ICPC NWERC 2004, UVa1331)
原题链接:https://vjudge.net/problem/UVA-1331分类:最优三角剖分备注:区间DP要注意围成的三角形内部不能有点,否则就不是正规的划分三角形了。#include<bits/stdc++.h>using namespace std;const int maxm=55;const double inf=0x3f3f3f3f;const double eps=1e-6;int n,m;double dp[maxm][maxm];struct Poin原创 2021-03-14 07:54:24 · 264 阅读 · 0 评论 -
例题 9-10 括号序列(Brackets Sequence, NEERC 2001, UVa1626)
原题链接:https://vjudge.net/problem/UVA-1626分类:最优矩阵链乘备注:递归形式#include<bits/stdc++.h>using namespace std;const int maxn=105;char s[maxn];int t,n,d[maxn][maxn];bool match(char a,char b){ return (a=='['&&b==']')||(a=='('&&b==')');原创 2021-02-24 16:25:16 · 163 阅读 · 0 评论 -
例题 9-9 切木棍(Cutting Sticks, UVa 10003)
原题链接:https://vjudge.net/problem/UVA-10003分类:最优矩阵链乘备注:简单题#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;int l,n,c[55],dp[1005][1005];int d(int i,int j){ if(dp[i][j]!=inf)return dp[i][j]; int L=0,R=n+1,res=inf; w原创 2021-02-23 22:04:05 · 271 阅读 · 0 评论 -
例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)
原题链接:https://vjudge.net/problem/UVA-1625分类:LCS型备注:类似于LCS,指标函数的分解hav[i][j]应该表示在串A取完i个字符和串B取完j个字符之后的状态,即有多少种字母已经被取过,但没有用完。之前看紫书的时候,比如GBBY和YRRGB,从(1,3)到(1,4),Y和G要加1,我就理解成了hav[1][4]=2,实际上,从这样(i,j-1)到(i,j)应该加的是hav[i][j-1]。上面内容理解后,很容易有dp[i][j]=min(dp[i-1][j]原创 2021-02-17 23:52:53 · 297 阅读 · 0 评论 -
例题 9-7 划分成回文串(Partitoning by Palindromes, UVa 11584)
原题链接:https://vjudge.net/problem/UVA-11584分类:线性结构备注:LIS变形#include<bits/stdc++.h>using namespace std;const int maxn=1e3+5;char s[maxn];bool check(int st,int ed){ for(int i=st,j=ed;i<j;i++,j--) if(s[i]!=s[j])return false; retur原创 2021-02-11 17:50:56 · 153 阅读 · 0 评论 -
例题 9-6 照明系统设计(Lighting System Design, UVa 11400)
原题链接:https://vjudge.net/problem/UVA-11400分类:线性结构备注:LIS变形#include<bits/stdc++.h>using namespace std;const int maxn=1e3+5;const int inf=0x3f3f3f3f;int n,s[maxn],dp[maxn];struct Node{ int v,k,c,l; bool operator < (const Node& rhs)原创 2021-02-11 17:31:30 · 253 阅读 · 0 评论 -
例题 9-5 劲歌金曲(Jin Ge Jin Qu [h]ao Rujia Liu‘s Present 6, UVa 12563)
原题链接:https://vjudge.net/problem/UVA-12563分类:0-1背包备注:0-1背包变形。注意:千万不要包括给的时间t,因为劲歌金曲是必须要唱的!#include<bits/stdc++.h>using namespace std;const int maxt=50*180+678;int T,t,n,a[55],dp[55][maxt+5];int main(void){ // freopen("in.txt","r",stdin);原创 2021-02-11 16:29:33 · 472 阅读 · 0 评论 -
例题 9-4 单向TSP(Unidirectional TSP, UVa 116)
原题链接:https://vjudge.net/problem/UVA-116分类:TSP备注:多段图的最短路;字典序最小解#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;int m,n,a[15][105],d[15][105],nxt[15][105],first;int main(void){ // freopen("in.txt","r",stdin); while(~s原创 2021-02-11 09:39:24 · 217 阅读 · 0 评论 -
例题 9-3 旅行(Tour, ACM/ICPC SEERC 2005, UVa1347)
原题链接:https://vjudge.net/problem/UVA-1347分类:DAG备注:经典问题#include<bits/stdc++.h>using namespace std;const int maxn=1e3+5;struct Point{ int x,y;}p[maxn];int n;double dis[maxn][maxn],res[maxn][maxn];double dp(int i,int j){ if(res[i][j]!=0原创 2021-02-10 13:11:37 · 307 阅读 · 0 评论 -
例题 9-2 巴比伦塔(The Tower of Babylon, UVa 437)
原题链接:https://vjudge.net/problem/UVA-437分类:DAG备注:记忆化搜索#include<bits/stdc++.h>using namespace std;const int maxn=35;struct Cube{ int len,wid,hig;}c[maxn*3];int res[maxn*3],n,tot,kase;int dp(int ind){ if(res[ind])return res[ind]; re原创 2021-02-10 11:54:51 · 234 阅读 · 0 评论 -
例题 9-1 城市里的间谍(A Spy in the Metro, ACM/ICPC World Finals 2003, UVa1025)
原题链接:https://vjudge.net/problem/UVA-1025分类:思维题备注:DAG的动态规划#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;const int maxn=205;int n,T,t[maxn],M1,M2,has_train[maxn][maxn][2];int dp[maxn][maxn],kase;int main(void){ // fre原创 2021-02-09 23:36:41 · 189 阅读 · 0 评论