- 博客(11)
- 资源 (3)
- 收藏
- 关注
原创 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 383
原创 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 519
原创 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 362
原创 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 360
原创 UVA 10310
题意:求面值n用k个金币组成的方法数。 思路:一开始直接想到设状态dp(i,j)为面值i用j个硬币表示的方法数,但最后发现没办法转移,看到有人说用无限背包,可能是我理解不够深入,交了几次都WA了,最后查了写资料,发现需要用到一个结论,即面值i用j个金币组成的方法数等于面值i用不超过j的面值的金币组成的方法数。关于证明可以百度,用到了ferrers图像的性质,这样一来状态dp(i,j)表示面值
2015-01-27 23:48:44 422
原创 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 454
原创 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 351
原创 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 394
原创 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 488
原创 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 341
原创 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 402
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人