- 博客(30)
- 资源 (3)
- 收藏
- 关注
原创 线段树,一个更复杂的区间修改
今天AC了一道关于线段树比较复杂的题目,是关于区间修改的,但不同之处在于,修改方式有两种,一种是将给定区间内每个元素加上一个数--add,另一种是将给定区间内的所有元素设置为同一个数--set,对于每一次修改,输出整个区间的和。 可知本题关键在于pushdown函数,对于线段树中的每个节点,若我们仅仅简单的维护两个懒惰标记,并根据不同的修改方式和标志间的次序进行下放更新的话,显然有很多种情况
2014-11-30 14:21:22 1003
原创 UVA 357
和UVA 147一样的题,dp求解,直接代码:#include #include using namespace std;int query[10000],size=0;long long dp[30010]={1};int main(){ int t,end=0,m[]={1,5,10,25,50}; while(cin>>t){ query[size++]=t; e
2014-11-30 00:21:08 442
原创 UVA 147
完全背包问题,但题目给出的是实数,但单位金币只精确到美分,所以讲金币数乘100,但这样会WA,原因竟然是数据可能会给到小数点后两位以上,所以应该四舍五入一下。 还有一点就是,我们可以先将所有数据接收进来存储,然后再dp,这样一边就可以得出所有答案。#include #include #include using namespace std;double ans[100000];
2014-11-29 21:24:54 417
原创 UVA 10066 10192
两道题都是求最长公共子序列,注意第二题的输入,字符串包含空格。10066#include #include #include #include using namespace std;int a[110],b[110],dp[110][110];int main(){ int n1,n2,T=1; while(cin>>n1>>n2&&(n1||n2)){ for(i
2014-11-29 20:20:02 399
原创 UVA 10131
题目大意是给定一个序列,每个元素有两项,要求找到最长的子序列,满足第一项递增,第二项递减,其实就是一个简单的DAG动态规划问题,我们将偏序关系定义为若i的第一项小于j的第一项,且i的第二项大于j的第二项,则i《j,那么此时构成DAG,找最长路径即可。 状态的定义和状态转移方程不在多说,适当的总结一下,并不是一定要满足直观的大于小于才能构造DAG,对于一个问题,只要能抽象出偏序关系,即可尝试构
2014-11-29 17:00:50 409
原创 UVA 116
题目大意是给定一个矩阵,每次向右走一列,可以从第一列的任意一行开始,最后一列的任意一行结束,每次可以走下一列的正右,右上和右下,求一条路径,是路径上权值和最小,并且打印路径,路径序列要字典序最小。 我们用m存储原式矩阵,定义状态dp(i,j)为从第i行第j列走出矩阵所需最小和,path(i,j)为从第i行第j列走出矩阵的最优路径中,第j+1列应该走的行号。那么状态转移方程为:dp
2014-11-29 14:01:47 384
原创 UVA 10003
题目大意是给定一根木棍和n个切割点,每次切割的代价为所切木棍的长度,求切成n+1段的最小代价。 定义状态dp[i][j]为第i个切割点和第j个切割点之间切割的最小大家,那么状态转移方程为dp[i][j]=Min{dp[i][k]+dp[k][j]}+cost(i,j)(i#include #include #include using namespace std;int dp[5
2014-11-29 11:34:14 521
原创 UVA 103
题目让求给定的n个d维物体中可以嵌套的最长序列的长度和序列,显然需要先将每个物体的d个参数排序,此时可以用类似字典序的方法给出任何两个物体的大小关系,这里需要注意的是,任何两个物体对应位置上的参数若相等则不算包含,故抽象为DAG求最长路径。这里有两种状态的定义方法,第一种:定义状态dp(i)为以第i个物体为最外层最多可以嵌套物体的数量,那么状态转移方程为:dp(i)=Max{dp(j)}+1,其中
2014-11-28 19:51:36 337
原创 UVA 10405
我们定义状态dp(i,j)为第一个字符串的前i位于第二个字符串的前j位的最长公共序列的长度,那么很容易求出状态转移方程为: if(a[i]==b[j]) dp(i,j)=dp(i-1,j-1)+1; else dp(i,j)=Max{dp(i-1,j),dp(i,j-1)}; 相等情况很好理解,不相等的情况其实也很简单,a串的前i个字符和b串的前j个字符的最长
2014-11-27 20:33:11 607
原创 UVA 674
经典的dp题目,我们设状态dp(i)为总面值为i时的方式数,那么状态转移方程为dp(i)=dp(i)+dp(i-c[j]),其中c为数组,表示的各个单位面值。#include #include using namespace std;int dp[8000];int main(){ int n,c[]={1,5,10,25,50}; while(cin>>n){ memset
2014-11-26 20:05:23 398
原创 UVA 111
这题简直不要这么难以理解,具体翻译可以看NOCOW上给出的翻译:http://www.nocow.cn/index.php/UVA/111。 理解题意之后很明显是一个球最长上升子序列的dp问题,定义状态dp(i) 为第i个答案能和之前给出的答案组合得到的最高分,那么状态转移方程为dp(i)=max{dp(j)}+1 (0#include #include using namespa
2014-11-26 19:41:10 495
原创 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 382
原创 UVA 10382
题目大意是给定一个长l宽w的草坪,有n个喷水头,每个处于水平中间位置,给定其距离左边的距离和半径,求最少几个喷头可覆盖整个草坪。 形状不是我们所关心的,我们只关心喷头能完全覆盖的区间,这里完全覆盖的区间指的是覆盖区域减去两端两个小半圆后剩下的矩形区域,我们令t=sqrt(r*r-w*w/4),之后用圆心坐标加减t即可得到区间左右端位置,此时问题转化成区间覆盖问题。#include #i
2014-11-26 18:26:03 384
原创 UVA 10720
题目大意是给定n个顶点的度,Havel-Hakimi判断有没有可能构成一个图。贪心法,每次选择当前集合中度最大的顶点,假设其度为k,那么我们尽可能和其之后度前k大的节点相连,若为0,则不可能,但没想到这还是一个名字听起来特别高端的定理,Havel-Hakimi定理。注意剪枝,并且这里有一个让本人wa了n次的概念性问题就是,简单图可以使不连通的。#include #include #incl
2014-11-25 18:03:53 392
原创 UVA 10706
本来各种算以免超时,最后发现直接暴力模拟就过了,才用了42ms。#include #include #include using namespace std;string t;int main(){ int T; cin>>T; while(T--){ t.clear(); int pos,n=1; cin>>pos; t="1"; while(pos>t
2014-11-05 21:05:25 352
原创 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 372
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人