- 博客(26)
- 资源 (2)
- 收藏
- 关注
原创 rqnoj-429词链-字典树
不晓得字典树的问题怎么跑到动态规划上了。。。裸字典树,传递当前字典路上的数量#include#include#include#include#define maxn 51*10000using namespace std;struct list{ int id; int num; struct list *next[27];}*root;int m
2013-11-29 17:15:24 1198
原创 rqnoj-413-递增序列-dp
dp[i][j]: 从1到i这一段,有j个逗号,最后一个逗号的位置。dp[i][j]=max(dp[k][j-1]),k#include#include#include#includeusing namespace std;char str[101];int num[101];int dp[101][101];int bijiao(int x,int y,int xx,in
2013-11-29 16:40:19 992
原创 cf-Round #215 (Div. 1) -B - Sereja ans Anagrams
昨晚上状态真的很不好,A题一个水题竟然把数组开错了。。。B题也是水题一个,开数组,遍历P。可以把数组a看成p个单链。第一个链:1,1+p,1+2p,......,1+(m-1)p第 i个链:i,i+p,i+2*p,i+3*p....i+(m-1)*p;这样每一个链从头往后扫,若扫到合适的情况,就记录下来。其中要把b数组离散,然后二分查找a数组中的元素在b中的位置。#
2013-11-27 09:35:21 1327
原创 cf-Round #214 (Div. 2)-D-Dima and Trap Graph-dfs+二分
遍历下界,二分上届。dfs是否合适。#include#include#include#includeusing namespace std;#define INF 99999999#define maxn 4001struct list{ int u; int v; int next; int l; int r;}node[maxn*4
2013-11-26 16:55:12 1235
原创 cf-366C-Dima and Salad
把问题重新定义为c=a-b*k;寻找一系列c为0的时候a最大的值。因为c可正可负。所以把c正的01背包一次。把c负的01背包一次。当二者相等的时候,把a相加,取最大值。#include#include#include#includeusing namespace std;#define INF 99999999int n,k,i,j;int num[101];
2013-11-26 09:38:01 1915
原创 二进制的简单运用
把右边连续的1变为0 ---------> x&(x+1)把右边连续的0变为1---------->x | (x- 1) 取右边连续的1------------------>(x^(x+1))>>1 去掉右边第一个1的左边------>x&(x^(x-1)) 判断二进制中的1的个数是偶数个还是奇数个int have_jo(
2013-11-23 21:27:55 1829
原创 cf-279E - Beautiful Decomposition-贪心
对于一串二进制。若当前的值的情况是010,那么直接+1;若当前值的情况是01...1(1的个数大于等于2)0,那么相当于最后一位变为1,然后减去第一个1;#include#include#include#includeusing namespace std;#define maxn 2000010int maps[501][501];int xx[5]={1,0,-1,0
2013-11-23 20:52:37 1736
原创 cf-279D - The Minimum Number of Variables-数位dp
数位dp没学好~~假如每一个数放在一个空箱里。状态10010代表目前第2个数和第5个数在空箱里。dp[i]:i状态最少需要几个空箱。dp[i]:所有i状态的子状态最小需要的空箱数。dp[1]=1;#include#include#include#includeusing namespace std;#define maxn 24int a[maxn];int
2013-11-23 20:46:48 997
原创 cf-364B-Free Market
赤裸裸的推结论啊有没有。。如果能拿到当前值,那么与当前值差值不超过d的值可以拿到。dp求解那些值可以拿到。然后每次拿最大值即可。#include#include#include#includeusing namespace std;int dp[550000];int main(){ int n,k,i,a,sum,j; while(~scanf("%d%
2013-11-23 20:41:46 1437
原创 cf-213-div1-A. Matrix
当时比赛的时候弱爆了,当时只往求数组和上想了,没有想到这个问题的本质。做法:题目相当于就是取两节子字符串,然后把这两节子字符串的和相乘等于a。ns[i]: 子字符串的和等于i的子字符串的个数。#include#include#include#includeusing namespace std;#define ll __int64ll num[4040];ll
2013-11-20 16:27:32 1650
原创 rqnoj-412-POWER-区域动归
这个题目真的做的很惆怅。拿到题目第一眼就知道是一个裸的区域动归。但是不晓得状态怎么转移。一开始想的是状态表示的是当前范围内消耗的最小能量。但是后来一想不行。于是才把状态表示为全局的消耗最小的能量。dp[i][j][0]:在i到j范围内的灯都被点亮了,最后停在了j上,此时全局消耗的最小的能量dp[i][j][1]:在i到j范围内的灯都被点亮了,最后停在了i上,此时全局消耗的最小的
2013-11-19 18:47:28 1305
原创 rqnoj-396-SY学语文-dp
纯动态规划。注意初始化为-INF#include#include#include#include#define INF 99999999#define max3(a,b,c) max(max(a,b),c)using namespace std;int n,m,i,j;int map[1010][1010];int dp[1010][1010];int main(){
2013-11-17 17:25:53 849
原创 rqnoj-390-地震了!-动态规划
一步步的往前走,判断当前状态与上一个状态的关闭。注意,题目输入的楼层的速度是从小到大,而实际运用的楼层顺序是从大到小。。#include#include#include#include#define max3(a,b,c) max(max(a,b),c)using namespace std;int dp[110][221];int b[10010];int main()
2013-11-17 17:06:46 1068
原创 rqnoj-356-mty的格斗-二维背包
二维背包问题,注意初始化和状态转移。#include#include#include#includeusing namespace std;#define INF 99999999int a,b;int dp[110][110];int main(){ int n,m,p,i,j,k; while(~scanf("%d%d%d",&n,&m,&p))
2013-11-17 16:19:25 1091
原创 如何快速取得一个二进制状态的所有子状态
int main(){ int s; while(cin>>s) { print(s); for(int i=s; i>=0; i=(i>0?(i-1)&s:-1)) { print(i); } } return 0;}代码中的i表示的是所有s中为0,i中也为0
2013-11-17 15:51:14 1719
原创 cf-362C-Insertion Sort
题意:已知一个无序的序列,使用冒泡排序对其进行排序,需要进行一定的SWAP()操作次数。现在,让你从这个序列任意选择两个数进行交换,交换后再进行冒泡排序,使得交换后进行的冒泡排序中SWAP的操作尽可能的少。样例1解析:4 0 3 1 2进行冒泡排序需要进行6次SWAP操作。如果交换4,2,那么2 0 3 1 4只需要进行3次SWAP操作。交换4,1,那么1 0 3 4
2013-11-15 16:14:18 1946
原创 rqnoj-342-最不听话的机器人-dp
dp[i][j][k][[l]: 执行第i步,执行到点(j,k),方向为l时,用的最大步数。状态转移根据step[i]转移。#include#include#include#include#define INF 99999999using namespace std;int xx[4]={1,0,-1,0};int yy[4]={0,-1,0,1};int dp[2][11
2013-11-14 16:29:35 1293
原创 rqnoj-329-刘翔!加油!-二维背包
注意排除干扰项。因为价值不会相等,所以价值的多少与本题没有任何关系,。所以价值为干扰项,所以不用考虑。二维背包,简单求解。#include#include#include#include#define INF 99999999int dp[110][110];using namespace std;int main(){ int n,m,ts,i,j,k,v
2013-11-14 15:00:09 1048
原创 rqnoj-314-[NOIP2000]方格取数-多线程dp
多线程dp;同时计算两条路的最大值。按对角线划分阶段,共计2n-1个阶段。f[i][x][y]第i个阶段,两条路分别走到x和y点的最大值枚举x点的上两个点的,y点的上两个点,共分析上一阶段的4个f()值,取其最大。如果x=y,只加一次该点的值。如果x#include#include#include#include#define max4(a,
2013-11-13 17:53:47 3500
原创 rqnoj-285-麻烦的聚餐-dp
很好写的状态转移方程。dp[i][j]=dp[i-1][k];#include#include#include#includeusing namespace std;#define maxn 30030#define INF 9999999int dp[maxn][3];int dps[maxn][3];int a[maxn];int main(){ int
2013-11-13 15:39:10 1115
原创 rqnoj-279-是时候说了-背包
0 1背包问题的拓展。注意有一个封顶值为100;在判断边界条件时,0可取,100不可取。#include#include#include#includeusing namespace std;#define maxn 110#define INF 9999999int dp[110];int l[101];int g[101];int main(){ in
2013-11-13 15:07:08 948
原创 rqnoj-275-FOLDING-记忆化搜索
记忆化搜索很简单,就是用的时候老是想不到~~无奈的感觉~~~dp[l][r] :l到r这一段中的最小表示方法。#include#include#include#include#include#include#include#include#include#define INT_MAX 0x7fffffff#define maxn 101#define max3(a
2013-11-10 21:04:27 775
原创 rqnoj-273-马棚问题-dp
dp[i][j]: 从0到i匹马,住进j个马棚里,最小的不愉快系数。num[i][j]: 把第i匹马到第j匹马放进一个马棚里,产生的不愉快系数dp[i][j]=min(dp[i][j],dp[ii][j-1]+num[ii+1][i]);时间复杂度:n*n*k#include#include#include#include#includeusing namespa
2013-11-09 16:22:00 1160
原创 rqnoj-242-大地的秘密-最长上升子序列
最长上升子序列的长度即为不需要调整的数字的个数。求最长上升子序列用O(n*log(n))算法、#include#include#include#include#includeusing namespace std;#define maxn 100010int vis[maxn];int num[maxn];int n;int nums;int ins[maxn];
2013-11-09 14:35:40 1358
原创 rqnoj-231- 我爱面包 -dp
就是从后往前搜,一个前指针st,一个后指针ed;如果后指针ed往后走的过程中出现了可以吃的面包序列。那么就把st指针尽量的往后走。这过程中出现的最优值即是答案。#include#include#include#include#includeusing namespace std;#define INF 9999999#define maxn 1000011int
2013-11-09 13:09:50 888
原创 rqnoj-225-书本整理-逆向思维dp
逆向思维。题目要求拿走k本书,那么就求从中拿n-k本书。dp[i][j]:代表拿第i本书,从前i中拿k本书,最小的整齐度。num[i]: 第i本书的高度。dp[i][j]=dp[0...i-1][j-1]+|num[i]-num[j]|;#include#include#include#include#includeusing namespace std;#de
2013-11-07 13:37:24 951
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人