![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UVA
jinTester
这个作者很懒,什么都没留下…
展开
-
UVA 106 (勾股数)
#include #include bool is[1000010];int gcd(int a,int b){ int r=1; while(r){ r=a%b; a=b;b=r; } return a;}int main(){ int n; while(scanf("%d",&n)!=EOF){ int ans1=0,ans2=0; for(int i原创 2015-03-30 20:22:09 · 490 阅读 · 0 评论 -
UVA 624
01背包的变形,把时间看做花费和价值即可,同事记录路径即可,一开始以为在相同价值下要尽量多的选额track,最后测试了一下发现只要满足条件即可:#include #include #include using namespace std;int dp[100000];int pt[100000];int main(){ //freopen("in.txt","r",stdin)原创 2014-12-09 19:27:40 · 381 阅读 · 0 评论 -
UVA 10635
题意:给定两个序列,每个序列中的数字范围值1~n^2(2 思路:这个一开始先想到了空间复杂度需要优化,然后发现对于状态d(i,j)表示第一个序列的前i位和第二个序列的前j位的LCS可以用滚动数组优化空间为O(n),时间复杂度还是O(n^2),虽然用处不大,还是留作纪念。for(int i=1;i>a[i];for(int i=1;i>b[i];for(int i=1;i<=p;i++原创 2015-01-31 11:05:26 · 376 阅读 · 0 评论 -
UVA 10564
题意:给定沙漏,每个格子对应一个数,求给定路径权值和的路径条数即最小起点,最小字典序的路径。 思路:有数据范围可定义状态dp(i,j,k)表示第i行第j个格子到达终点的权值和为k的路径条数,那么 对于倒三角:dp(i,j,k)=dp(i+1,j-1,k-e[i][j])+dp(i+1,j,k-e[i][j]); 对于正三角:dp(i,j,k)=dp(i+1原创 2015-02-01 11:06:18 · 493 阅读 · 0 评论 -
UVA 10306
理解题意真是一个硬伤,这一题大致是格丁n个向量,求用这些向量相加得到给定长度的最小数。二维无限背包。一开始用了vector存到达过哪些节点,但写完发现没把顺序考虑进去,就直接遍历矩阵更新状态了。#include #include #include using namespace std;int dp[310][310];int main(){ int T; cin>>T; w原创 2014-12-22 20:46:27 · 363 阅读 · 0 评论 -
UVA 590
题目大意为小偷逃跑,有n个城市可以去,计划逃脱k天,问第k天到达目的地即n号城市的最小花费,主要是输入那部分比较不太好理解,每n-1行对应一个城市到达另外n-1个城市的信息,d表示循环节,之后d个整数表示每天的费用,0表示没有航班。 设状态dp(t,i)表示第t天在i号城市的最小花费,那么状态转移为dp(t,i)=min{dp[t-1][j]}(dp[t-1][j]!=-1 && cost原创 2014-12-22 15:00:37 · 463 阅读 · 0 评论 -
SPFA算法
求最短途径算法,因为其时间复杂度为O(|E|),所以适合边数较少的最短路径问题。 推荐两个不错的讲解,一个是hihocoder上的,http://hihocoder.com/contest/hiho25/problem/1,还有一个是NOCOW,http://www.nocow.cn/index.php/SPFA。 下边是一道裸SPFA的题目,输入顶点数,边数,起点,终点,求起点到终点原创 2014-12-21 11:45:40 · 381 阅读 · 0 评论 -
UVA 10911
题意:求最小的组合代价。 思路:状态压缩,因为最多只有16个人,且只需考虑当前状态下是否在集合中,所以状态dp(i)表示状态为i时的最小代价,转移时必须确保枚举的两个人均不在集合中,还有一点需要注意的是初始化。#include #include #include #include using namespace std;double d[20][20],dp[132000];原创 2015-01-29 00:07:48 · 510 阅读 · 0 评论 -
UVA 11151
题意:求最长回文子序列。 思路:状态dp(i,j)表示从i到j的最长回文子序列长度,那么 dp(i,j)=dp(i+1,j-1)+2,str[i]==str[j] dp(i,j)=max(dp(i+1,j),dp(i,j-1)),str[i]!=str[j]#include #include #include #include using namespace原创 2015-01-28 14:03:07 · 357 阅读 · 0 评论 -
UVA 10891
题意:给定一组数,每一次选手可从左右两端任意一段选取连续的任意个数,至少选一个,甲先手,保证每次最优,则最后甲比乙得分多多少。 思路:和两端取一个数字的做法差不多,即dp(i,j)表示对于从i到j的序列,先手可得得最大分,那么dp(i,j)=sum(i,j)-min{min{dp(i,k)} (k=i~j-1),min{dp(k,j) (k=i+1~j)}},注意再求最小值是因为可以把整原创 2015-01-28 11:59:36 · 348 阅读 · 0 评论 -
UVA 10651
题目大意是给12个空槽,初始时有以下空槽中有石头,可以把两个连续的石头移动到相邻的一个空槽,并移调中间的石头,求最少剩余几块石头。 用一个整数表示状态,因公也就不到10000种状态,数组记录即可,状态转移用位操作即可。#include #include #include #include #define lowbit(x) x&(-x)using namespace std;原创 2014-12-20 13:25:50 · 371 阅读 · 0 评论 -
UVA 10310
题意:求面值n用k个金币组成的方法数。 思路:一开始直接想到设状态dp(i,j)为面值i用j个硬币表示的方法数,但最后发现没办法转移,看到有人说用无限背包,可能是我理解不够深入,交了几次都WA了,最后查了写资料,发现需要用到一个结论,即面值i用j个金币组成的方法数等于面值i用不超过j的面值的金币组成的方法数。关于证明可以百度,用到了ferrers图像的性质,这样一来状态dp(i,j)表示面值原创 2015-01-27 23:48:44 · 417 阅读 · 0 评论 -
UVA 10029
题意:给定一个字典,找出连续变换的最长路径。 思路:我只想说LIS不超时啊,只需要预处理求出每个字符串长度就ok了。#include #include #include #include using namespace std;char e[25010][17];int dp[25010]={0},l[25010];bool ji(int pi,int pj,int li,原创 2015-01-27 11:32:27 · 442 阅读 · 0 评论 -
UVA 531
最长公共子串,需要求解路径,需先求解出最大长度,然后逆向求解。#include #include #include #include #include #include using namespace std;vector ta,tb,ans;int dp[110][110];int main(){ //freopen("in.txt","r",stdin); stri原创 2014-12-09 20:11:28 · 447 阅读 · 0 评论 -
UVA 348
大致题意为给定一个矩阵序列,求最小运算次数的次序。记忆化搜索,再根据dp结果查找路径即可,设状态dp(i,j)为第i个矩阵到第j个矩阵的最小运算次数,那么状态转移方程为dp(i,j)=min{dp(i,k)+dp(k+1,j)+r(i)*c(k)*c(j)},其中i#include #include #include using namespace std;int r[11],c[11原创 2014-12-08 22:15:52 · 492 阅读 · 0 评论 -
UVA 10673
还整什么求解模线性方程,题目比较特殊,并且可以输出任何一组解,那么看了大神的题解之后恍然大悟#include int main(){ int T; scanf("%d",&T); while(T--){ long long n,m; scanf("%I64d%I64d",&n,&m); if(n%m) printf("%I64d %I64d\n",-n,n);原创 2015-03-30 20:23:48 · 396 阅读 · 0 评论 -
UVA 10453
题意:给定一个字符串,可向任意位置添加字符以构成回文串,求最少添加字符数和处理后的字符串。 思路:定义状态dp(i,j)为原串第i个字符到第j个字符够成回文的最小添加数,则 dp(i,j)=dp(i+1,j-1),(str[i]==str[j]) dp(i,j)=min{dp(i+1,j),dp(i,j-1)}+1,(str[i]!=str[j]) 相等原创 2015-01-24 11:24:46 · 339 阅读 · 0 评论 -
UVA 10201
题意:过n个加油站,没站油价不等,问达到目的地的最小花费,其实100L油,到达终点至少100L油。 设状态dp(i,j)表示在第i个加油站有jL油的最小花费,初始dp(i,j)=min{dp(i,j),dp(i-1,j+dis(i,i-1))},然后根据油价尝试更新dp(i,k),(k>j)。 小心数据所给加油站并不是都在起点到终点的区间内。#include #include原创 2015-01-24 11:04:37 · 385 阅读 · 0 评论 -
UVA 10154
题意:有n个乌龟,每个乌龟又一个重量和一个力量,叠罗汉,每个乌龟受重不大于其力量减去自身重量,问最高能叠多少层。 思路:存在一个最优解使得乌龟的力量从上到下是递增的,证明是比较简单的,对于任何一个最优解,假设相邻两层的重量为w[i-1]和w[i],力量为s[i-1]和s[i],并且s[i-1]>s[i],上方的最大重量为s[i]-w[i]-w[i-1],此时交换两个乌龟的位置,则上方最大重量原创 2015-01-22 20:00:49 · 479 阅读 · 0 评论 -
UVA 10617
#include #include #include using namespace std;long long dp[100][100];int main(){ int T; cin>>T; while(T--){ string t; cin>>t; memset(dp,0,sizeof(dp)); for(int i=1;i<=t.length();i++)原创 2015-01-19 18:37:53 · 337 阅读 · 0 评论 -
UVA 620
一开始题意没太弄懂,感觉是一道高大上的题目,姿势都摆好了他就给我看这个能信,只需判断是否符合要求确定哪种类型即可!#include #include using namespace std;char t[10000];int main(){ int n; cin>>n; while(n--){ cin>>t; int len=strlen(t); if(!(len&原创 2014-12-13 20:56:05 · 370 阅读 · 0 评论 -
UVA 825
题意是给定一个矩阵,其中一些节点不能走,求最短路径数,可知最短路径为左上角到右下角的曼哈顿距离,所以每个点只能向下或向右走,判断其上节点和左节点是否可行即可。#include #include #include using namespace std;bool m[1000][1000];int dp[1000][1000];int main(){ int T; cin>>T原创 2014-12-14 11:24:16 · 387 阅读 · 0 评论 -
UVA 437
题意大致是给定n种长方体,每种无限多个,求累起来的最高高度。可知一个长方体有6中摆放方式,且同一长方体的同一种摆放方式最多用一次,并且可知上边的长方体底面积一定小于下边的长方体,那么按底面积排序,之后根据条件求最长上升子序列即可。#include #include using namespace std;struct T{ int x,y,z;}t[200];bool cmp(st原创 2014-12-12 21:14:49 · 363 阅读 · 0 评论 -
UVA 10271
状态dp(i,j)表前i只筷子中选出j对的代价,那么状态转移为dp(i,j)=min{dp(i-1,j),dp(i-2,j-1)+(leni-leni-1)^2}。#include #include #include using namespace std;int dp[5010][1010]={0},len[5010];int main(){ int T; cin>>T;原创 2015-01-19 11:00:45 · 393 阅读 · 0 评论 -
UVA 10465
题意是给定总时间t和两个黄油没吃一个的单位时间m、n。求尽量少的浪费t同事保证吃的数量最多,无限背包问题,价值为1,代价为n和m,不过注意最后若t有浪费,需输出浪费了多少。#include #include #include using namespace std;int dp[10010];int main(){ int m,n,t; while(cin>>m>>n>>t){原创 2014-12-10 20:25:53 · 395 阅读 · 0 评论 -
UVA 10285
感觉这一题写过n次了,直接代码#include #include #include #include using namespace std;int r,c,m[110][110],dp[110][110];int dfs(int x,int y){ if(dp[x][y]!=-1) return dp[x][y]; int t=0; if(m[x+1][y]<m[x][y原创 2014-12-10 20:41:38 · 407 阅读 · 0 评论 -
UVA 10304 dp的四边形不等式优化
最优二叉搜索树问题,设状态dp(l,r)为l到r构成一颗二叉树的最小花费,则有状态转移方程dp(l,r)=min{dp(l,k-1)+dp(k+1,r)+w(l,r)} (l 可以用记忆化搜索求解,需要注意边界条件即l>r是返回0,由于函数调用所消耗的时间,记忆化搜索这题用了4.725s。#include #include #include using namespace std;原创 2014-12-26 16:33:04 · 438 阅读 · 0 评论 -
UVA 10534
这题的题意很简单,求满足题目所给性质的子序列的最长长度,一开始竟然晕晕乎乎的用了枚举中间元素+LIS的方法求解,好吧,必然超时,然后用了常规的方法,从左到右求一次递减,从右到左再求一次,最后比较求解,提交后发现还是超时,此时已然意识到求LIS问题应该有更快的方法,于是乎上网一搜,果然有,下面是转载闷瓜蛋子的专栏博客中转载的介绍LIS问题的nlogn方法,原作者因为没有标明所以不知道最初的出处。原创 2014-12-16 21:21:17 · 388 阅读 · 0 评论 -
UVA 10069
题意为求母串中子序列的个数。一开始以为100*100*10000*sizeof(int)会存不下,一顿挠头皮,最后看了报告才知道可以存下,好吧,那么设状态dp(i,j)为母串前i位中含有子串前j位的序列数,那么状态转移显然为,如果母串第i位等于子串第j为,那么此时需要加上母串前i-1位中含子串前j位的数量以及母串前j-1位中含子串前j-1的数量,式子为dp(i,j)=dp(i-1,j)+dp(i-原创 2014-12-16 15:16:47 · 479 阅读 · 0 评论 -
UVA 993
从9到2分别记录n能被几个i整除,最后若n不为1,则原创 2014-11-24 20:40:26 · 343 阅读 · 0 评论 -
UVA 10041
求中位数,然后求距离之和,审题不认真,直接输出中位数了!!!#include #include #include using namespace std;int ss[510];int main(){ int T; cin>>T; while(T--){ int n; cin>>n; for(int i=1;i>ss[i]; sort(ss+1,ss+n+1)原创 2014-11-26 18:43:02 · 376 阅读 · 0 评论 -
UVA 10382
题目大意是给定一个长l宽w的草坪,有n个喷水头,每个处于水平中间位置,给定其距离左边的距离和半径,求最少几个喷头可覆盖整个草坪。 形状不是我们所关心的,我们只关心喷头能完全覆盖的区间,这里完全覆盖的区间指的是覆盖区域减去两端两个小半圆后剩下的矩形区域,我们令t=sqrt(r*r-w*w/4),之后用圆心坐标加减t即可得到区间左右端位置,此时问题转化成区间覆盖问题。#include #i原创 2014-11-26 18:26:03 · 374 阅读 · 0 评论 -
UVA 757
题目大意是说,有个n个lake,原创 2014-11-20 21:38:31 · 442 阅读 · 0 评论 -
UVA 10148
这个题目是典型的区间选点问题,和原创 2014-11-19 21:12:24 · 548 阅读 · 0 评论 -
UVA 10720
题目大意是给定n个顶点的度,Havel-Hakimi判断有没有可能构成一个图。贪心法,每次选择当前集合中度最大的顶点,假设其度为k,那么我们尽可能和其之后度前k大的节点相连,若为0,则不可能,但没想到这还是一个名字听起来特别高端的定理,Havel-Hakimi定理。注意剪枝,并且这里有一个让本人wa了n次的概念性问题就是,简单图可以使不连通的。#include #include #incl原创 2014-11-25 18:03:53 · 386 阅读 · 0 评论 -
UVA 10341
精度比较头疼,直接二分法求解原创 2014-11-03 23:01:47 · 417 阅读 · 0 评论 -
UVA 270
#include #include #include #include #include #include using namespace std;double x[710],y[710];struct POINT{ double x,y;}p[710];bool cmp(struct POINT a,struct POINT b){ if(a.x==b.y) retur原创 2014-11-03 23:04:26 · 366 阅读 · 0 评论 -
UVA 10718
题目大意是在[l,u]这样的区间中找到一个数字原创 2014-11-18 20:44:09 · 364 阅读 · 0 评论 -
UVA 714
挺好的一道题,题意是说划分一个有m个元素的原创 2014-11-17 20:36:51 · 399 阅读 · 0 评论 -
UVA 10020
lrj入门经典中介绍的区间覆盖问题,裸的,不过贪心原创 2014-11-15 10:50:34 · 395 阅读 · 0 评论