摘要: 大意:ZZZ 喜欢睡觉,一堂课有N分钟,他至少要睡M分钟,他一旦听课就要连续地听L分钟。每分钟都有一个他可以拿到的分数。求他可以得到的最大分数。dp[i][j]在第i分钟,已经休息了j分钟的时候能得到的能得到的最大分数。sum[i]记录i以及以前的分数和。防止重复计算。状态转移方程dp[i][j]=max(dp[i-1][j-1],max(dp[i-k][j]+sum[i]-sum[i-k]))其中k>=l,k<=i-j 表示这分钟睡觉了 表示这分钟在学习如果我们在每次循环的时候都把max(dp[i-k][j]+sum[i]-sum[i-k])重新算一遍,这样会超时。res数组用来 阅读全文
posted @ 2011-08-04 21:50 ω 提拉米兔 ℃ 阅读(365) 评论(0) 推荐(0)
摘要: 打比赛的时候想这个题想了好长时间啊啊啊啊……后来谁知道这道题居然是神题啊啊啊啊……官方题解:引理 1:若 cosA 为有理数,n 为整数,则 cos(nA)也为有理数。证:n=1,2 时,cos(nA)为有理。若 n=1..k 时均成立,即 n<=k 时,cos(nA)为有理数,此时有 cos(kA) =cos((k-1)A)*cos(A) - sin((k-1)A)*sin(A), sin((k-1)A)*sin(A)故有理。当 n=k+1 时:有 cos((k+1)A) = cos((k-1)A)*cos(2A) - sin((k-1)A)*sin(2A) =cos((k-1)A)* 阅读全文
posted @ 2011-08-03 20:27 ω 提拉米兔 ℃ 阅读(321) 评论(0) 推荐(0)
摘要: 多校又被虐惨了…… 这个题下来写了一下 就是因为没有加memset和去掉freopen wa了几次……官方题解:直接暴力枚举 O(N^3*GCD)会超时。可以先计算出有一组互素或者两组互素的所有三元组个数 sum,最后把所有三元组的个数减去 sum。计算 a 可以做到 O(N^2*GCD)。可以这样来求一组互素或者两组互素的三元组:对于每个数 Ai,设与 Ai 互素的数在集合 Ni 中,与 Ai 不互素的数在集合 Mi 中,这样 Ai 和 Ni 中的一个数以及 Mi 中的一个数构成了“一组互素或者两组互素”这种情况,一共有|Ni|*|Mi|种情况。设实线表示互素,虚线表示不互素,那么一组互素( 阅读全文
posted @ 2011-08-03 19:28 ω 提拉米兔 ℃ 阅读(285) 评论(0) 推荐(1)
摘要: 这段时间都在做DP啊啊……大意:有F朵花和V个花瓶,F<V,不同的花在不同的花瓶里面观赏价值不一样,每个花瓶只能插一束花,而且花要按顺序插。求最大观赏价值。这个题关键就是有负值,注意初始化,在代码里面说把。。状态转移方程:dp[i][j]表示把i朵花插到j个花瓶里面能获得的最大美学价值则dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+map[i][j])PS:我现在都没明白怎么看题目满足最优子结构性质……汗啊啊啊啊啊……Problem:1157User:a27400Memory:484KTime:32MSLanguage:G++Result:Accepted#i 阅读全文
posted @ 2011-08-03 11:57 ω 提拉米兔 ℃ 阅读(431) 评论(0) 推荐(0)
摘要: 大意:给你一串只有1,2的数字,让你改变最少的次数,让这个序列变成非递减的。先开始看这个题目,完全不会做,去网上百度了一下,居然说这个题是求最长非递减子序列的长度,但是用nlogn算法求非严格递增的子序列长度我不会,只能另想办法。在网上搜到了一个神码,我现在都不知道为什么:#include<cstdio>int i,n,a,f[3]={0};int main(){ scanf("%d",&n); for(i=0;i<n;++i) { scanf("%d",&a),++f[a]; if(f[2]<f[1])f[2]= 阅读全文
posted @ 2011-08-01 16:25 ω 提拉米兔 ℃ 阅读(390) 评论(0) 推荐(0)
摘要: 先开始想了个错的……唉现在思维还进化地不足啊……首先要发现的是添加和删除是一样的,所以我们在选cost的时候只用选delete和add的较小值就可以了。状态转移方程:if(st[i]==st[j])dp[i][j]=dp[i+1][j-1];else if(st[i]!=st[j])dp[i][j]=max(dp[i+1][j]+cost[st[i]-'a'],dp[i][j-1]+cost[st[j]-'a']);在用记忆化搜索解决。注意边界情况,否则会搜死。//time:157MS//memory:16260K#include<cstdio>#i 阅读全文
posted @ 2011-07-31 16:59 ω 提拉米兔 ℃ 阅读(217) 评论(0) 推荐(0)
摘要: 题目看得我纠结死了……大意是,在一条线上有`N个城市,它们由一个污水处理系统连接着,每个城市有三个选择:1.把自己的污水排到河里V2.把自己的污水送到右边>3.把自己的污水送到左边<至少要有一个城市排水。要求给N个城市,方案种数。最左边只有两种选择:V,>令 dp[i][0]:V dp[i][1]:> dp[i][2]:<则:dp[i][0]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2] dp[i][1]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2] dp[i][2]=dp[i-1][0]+dp[i-1][2]//刚开始总是 阅读全文
posted @ 2011-07-31 12:10 ω 提拉米兔 ℃ 阅读(429) 评论(0) 推荐(0)
摘要: 大意:一群牛想要跳到月亮上面去,但是他们现在跳的能力为零。现在给你一些药水,能改变他们跳的能力。不能改变药水的顺序。当跳奇数跳的时候,就增加,当跳偶数跳的时候就减少。药水是可以跳过不喝的。先开始想的是把最大值最小值用一个二维数组表示,结果怎么想都想不出来,主要还是想到了要记步数,后来才去看解题报告,上面说什么开个二维数组,可以表示奇数步和偶数步。选与不选这个问题,在代码里面说明吧~~~#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<c 阅读全文
posted @ 2011-07-30 22:50 ω 提拉米兔 ℃ 阅读(276) 评论(0) 推荐(0)
摘要: 本来这个题是用字典树等等神算法实现的……结果我直接暴搞的。。。先开始写的LCS,后来超时惨了……就在网上查……结果发现LCS完全没必要,只用写一个o(n)的判断就可以了……#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>struct dict{ char s[30]; int len;};dict d[10010];int judge(char a[],char b[]){ int sum=0; int pos=-1; int size=strlen(b); 阅读全文
posted @ 2011-07-24 23:42 ω 提拉米兔 ℃ 阅读(169) 评论(0) 推荐(0)
摘要: 今天对着课件写了一个串的hash ha是最初的hash值,t是最终存放在数组里面的hash值,就是数组下标。由于不同的串产生的ha不一样,让hash[t]=ha,就可以判断当前的串是不是和原来的那个串一样了#include<cstdio>#include<cstdlib>#include<cstring>#define MAXN 7003int max;int hashtable[MAXN],count[MAXN];unsigned int hash(char *s){ unsigned int seed=131; unsigned int h=0; whi 阅读全文
posted @ 2011-07-24 10:57 ω 提拉米兔 ℃ 阅读(179) 评论(0) 推荐(0)