- 博客(70)
- 资源 (5)
- 收藏
- 关注
转载 动态规划最优化原理与无后效性
原文地址:http://www.jzsyz.jzedu.cn/xxjs/Suanfa/dtguihua/index.htm上面已经介绍了动态规划模型的基本组成,现在需要解决的问题是:什么样的“多阶段决策问题”才可以采用动态规划的方法求解? 一般来说,能够采用动态规划方法求解的问题必须满足.最优化原理和.无后效性原则。(1)动态规划的最优化原理。作为整个过程的最优策略具有如下性
2015-03-31 22:07:42 2753
原创 codeforces 4D Mysterious Present
题意:n个信封,第i个信封宽w[i],高h[i],现有宽为w,高为h的卡片,求满足下面条件的信封序列:1、宽、高大于卡片的宽、高2、序列中第i个信封宽、高严格小于第i+1个信封的宽、高分析:对于条件1,可以在输入时就把满足条件的信封记录下来;对于条件2,对满足条件1的信封按照宽由小到大排序。因为宽已经按照由小到大排序了,于是只需高度满足后者大于前者即可,所以对排好序的信封的
2015-03-31 20:15:45 703
原创 codeforces 3C Tic-tac-toe (想法题)
题意:三连棋游戏,给出棋盘上的情况,判断是否合法,若合法,判断谁获胜或者当前该谁下。(先手为X,后手为0,是数字0不是字母O!) 此题需考虑全面。首先考虑不合法的情况,有如下4种:1、X的数量少于0的数量。2、X的数量-0的数量>1。3、X数量等于0的数量,而此时存在三个X相连(即先手获胜)。这是不可能的,因为先手下子之后,X的数量必然多于0的数量,不可能相等。4、X的
2015-03-31 12:32:30 733
原创 codeforces 9C
题目大意:给出数n(1分析:1位数:12位数:10、113位数:100、101、110、111……即有:k位数:a、bk+1位数:a*10,a*10+1,b*10,b*10+1。 #includeusing namespace std;int ans=0;void get(int x,int n){ if(x>n) return; +
2015-03-30 22:51:46 703
原创 codeforces 3B (贪心)
两种船,大小分别为1、2。现有一辆容量为v的卡车,给出n艘船类型,以及相应的价值,求最大装载价值以及所选的船只编号。 贪心策略:将大小为1、2的船分开来,按照价值从大到小排序。然后按价值由大到小,先装入大小为2的船直到装不下,再装大小为1的船。记录下此时大小为1、2的船个数n1,n2,以及总价值。然后把已装入的价值最小的大小为2的船拿出,换成两艘大小为1的价值高的船,看价值是否增加,若增加
2015-03-30 22:25:57 757
原创 SGU 120 Archipelago (向量旋转)
给出n正多边形的两个顶点坐标n1,n2,求其余顶点坐标。1、先求出中心坐标C。2、根据中心坐标C和初始的一个顶点,进行一定角度的旋转,依次求出其他顶点。对于1:由两点n1,n2(不妨设n2>n1)和中心可形成一个三角形,已知两点坐标,可求该三角形的一边长y以及其它两边与中心所形成的夹角a=2π/n*(n2-n1),另外两个角相等,设为B,亦可求矣。然后根据余弦定
2015-03-26 22:29:51 431
原创 hdu 5179 (DFS)
求区间[L,R]内的beautiful number的个数。求出不超过L、R的beautiful number的个数sum(L),sum(R),结果即为sum(R)-sum(L-1)对于一个数num,从低位开始构造,由1开始枚举。若num大于当前构造的数则继续递归,否则返回结果。#include#include#include#include#include#incl
2015-03-26 16:00:44 427
原创 hdu 5178 pairs (二分)
求序列x中满足a排序后二分查找每个数加上k后的上界pos,结果累加pos-i即可#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define LL __int64int x[100005];int mai
2015-03-26 15:58:34 545
原创 SGU 119 Magic Pairs
已知N、A0、B0,对于给定X、Y,若A0X+B0Y能被N整除,则AX+BY也能被N整除,求所有的A、B。(0 A0X+B0Y、AX+BY均能被N整除,则显然A=k*A0,B=k*B0,0#include#includeusing namespace std;struct P{ int A,B;}p[10001];bool cmp(P x,P y){ re
2015-03-26 13:00:55 576
原创 hdu 5171(矩阵快速幂)
一个序列a,k次操作,每次把其中两个数的和相加后得到的新数添加到序列中,问最后得到的序列的和的最大值。 设最大的两个数为a[n],a[n-1],所有数的和为s[n],可得转移矩阵:(a[n],a[n-1],s[n])=(a[n-1],a[n-2],s[n-1])*(1 1 1)
2015-03-26 10:33:08 472
原创 514E (矩阵快速幂+DP)
一棵树,每个结点有n个儿子,该第i个儿子到父节点的距离为d[i],问离根节点距离不超过x的结点有多少个,结果对1e9+7取模。之前写的了,忘记是参考哪个大牛的博客了:以下是他的分析 首先注意到每个di * 用dp[i]表示到根节点长度为i的点的个数, 那么不难发现状态转移方程 * dp[x] = dp[x - 1]*t[1] + dp[x - 2]*t[2] + ... +
2015-03-26 10:27:09 437
原创 18D (贪心)
题:http://codeforces.com/problemset/problem/18/D对于每个顾客,若之前存在其要求的x,将其记录下来。然后将记录下来的x进行排序,取最大的,因为2^x>2^(x-1)+2^(x-2)+…… import java.math.*;import java.util.*;public class Main { static clas
2015-03-26 10:14:56 337
原创 514D (二分+区间最值)
题目传送题目大意:n*m的矩阵,最多可进行k次操作,每次使得一列上的所有数值-1,若一行的数值全变为0,则该行被破坏。问最长可连续破坏多少行。输出此时对于每一列的操作数。思路很直接:对于每一列,二分区间长度,枚举起点,求区间最大值。将每一列的区间最值相加,若不超过k,则该长度可行。对于输出方案,可开设数组a[i]记录长度为i的起点,若最终长度为len,则再次求区间[a[len],a
2015-03-26 10:10:23 552
原创 518E (贪心)
给一个拥有n个元素、可能含“?”的序列,通过构造使得所有数的绝对值之和最小,同时使得序列的连续的k项之和是严格递增的。题目传送门要满足连续K项和递增,即a[1]+a[2]+……+a[k]只需:a[1] a[2] …… 一开始想到的是枚举起点从1到n-k+1,终点到n。统计出现?的次数,每当出现一个非?的数时,求出之
2015-03-26 10:07:49 405
原创 204A (数学题或者数位DP?)
求区间[l,r]内最高位数字与个位数字相等的数的个数。 数位DP?其实只需求出不超过x的满足要求的数的个数sum(x),最后答案就是sum(r)-sum(l-1)对于x,若小于10,则sum(x)=x.若x不小于10,取x的最高位a,最低位b。可以发现如果a否则结果为上式再减1(因为a……a不能取) #includeusing namespace std;#
2015-03-26 10:06:14 434
原创 225C (DP)
225C一个n*m的图形,含有黑白像素。最少需要改变其中多少个像素使其每一列的像素颜色相同。且连续的颜色相同的像素带的宽度均在区间[x,y]之间。对于每一列,显然,要么把白色都改变为黑色,要么把黑色都变为白色。先统计每一列的黑白像素的数量,由于每一列的像素数量是确定的,为n,故只需统计每一列的白色像素数量即可。亦可统计其前i列的白色像素数量。这里设num[i]表示前i列的白色像素数
2015-03-26 10:01:46 352
原创 166E(DP)
一个顶点分别为A、B、C、D的四面体。每一步可从一个顶点走到另一个顶点,问从D出发经过n步回到D的方法数。设dp[i]表示走i步回到D的方法数。每走一步共3种可能,走n步共3^n种情况,用总的方法数减去走n-1步回到D的方法数,即为走n步回到D的方法数。即dp[n]=3^n-dp[n-1] #includeusing namespace std;#define MOD 10
2015-03-26 10:00:26 480
原创 189A (DP)
一条绳子长度为n,可截长度为a1或a2或a3。问最多截成多少段。裸的完全背包问题。#includeusing namespace std;int dp[4005];int main(){ int i,j,n,a[5]; cin>>n>>a[1]>>a[2]>>a[3]; for(i=1;i<=n;++i) dp[i]=-0x3f3f3f3f; for
2015-03-26 10:00:15 373
原创 264B (DP)
给一个递增的序列,求相邻元素不互质最长子序列的长度设dp[i]表示当前最后一位中含因子i的最长长度,则每输入一个数,找到它所有因子,更新维护数组dp即可,这样可避免求gcd#includeusing namespace std;#define maxn 100005vector m[maxn]; //m[i]存放数i含有的因子。int dp[maxn];//当前数中含
2015-03-26 09:56:48 460
原创 194B(LCM)
从n*n的一个正方形左下角开始沿着边顺时针走,每走n+1个单位画一个叉叉。当走到已经画叉的位置停止,问此时共画了多少个叉。、首先停止时走的总距离一定是4n的倍数,因为可以看做是从停止处出发又回到停止的位置,设走了p圈停止,则总距离为p*4*n,又设画了k个叉叉,则总距离又可表示为(k-1)*(n+1)。即有p*4*n=(k-1)*(n+1)。故只需求4*n与n+1的最小公倍数lcm(4n,
2015-03-26 09:55:59 429
原创 343A(gcd)
有阻值为1欧姆的电阻。问最少使用多少个这样的电阻通过串并联得到阻值为a/b的电阻。1、若a%b==0,则只需a/b个电阻。否则2、若a>b,设k=a/b的整数部分。则可通过串联k个电阻,使问题转化为得到阻值(a-k*b)/b,即(a%b)/b3、若a具体处理时,对于第三种情况只需交换a、b的值即可转变为第二种情况。上述过程其实就是一个辗转相除的过程。修改一下欧几里得算法
2015-03-26 09:54:51 489
原创 509B、C(贪心)
B题: n堆石子,每堆有a[i]个石子,现用至多k种颜色将其染色,染色规则如下:任意两堆中颜色为c的石子个数相差不超过1思路:用尽可能少的颜色染色。如何保证最少?首先将石子数量最少的那一堆全染色1,其他堆与其相同数量+1的石子也染成1,再看石子数量第二少的,依次下去。 #includeusing namespace std;struct P{ int colo
2015-03-26 09:48:32 373
原创 508D (欧拉路)
题目大意:n个长度为3的串,串abc,def能够连接在一起当且仅当b=d,c=e。问能否将这n个串拼接得到长度为n+2的串。可将每一个串视为一条边,前两个字符与后两个字符分别为顶点。则问题转化为有向图中求欧拉路。注意由于可能会出现重边以及环,用邻接矩阵存储时,每出现一条边,数量加1,遍历删边的时候减1即可欧拉回路、欧拉路存在的判定:1、欧拉路:
2015-03-26 09:47:40 394
原创 508B、C、E(贪心)
B、给一个奇数,要通过交换任意两个数,将它变成可得到的最大的偶数。奇数变偶数,显然只要把个位与其他位上任意一个偶数交换即可,要保证最大,则判断个位数是否大于当前位的偶数,若大于则交换即可,若个位数比其他各个位上的偶数都要小,则将它与最低位的偶数交换,这样可以保证最大。#includeusing namespace std; char n[100005];int main()
2015-03-26 09:43:29 447
原创 507E (Dijkstra+优先队列)
// 给无向简单连通图的m条边,求从顶点1到顶点n的最短路,同时使得最短路径中标记为0的边数与不在最短路径中标记为1的边数之和最小,输出这些边。//可以设边权为1,使用优先队列,当前路径长度小的优先,路径长度相等时,最短路径中标记为0的边少的优先。 #includeusing namespace std;#define maxn 100005struct Edge{
2015-03-26 09:41:44 316
原创 507D (数位DP)
/*求后缀中(大于0)存在能被k整除的n位数的个数从低位向高位按位DPdp[0][i][j] 后缀均不能被k整除、被k除余j、位数为i的数的个数dp[1][i][j] 存在能整除k的后缀、被k除余j、位数为i的数的个数*/#includeusing namespace std;typedef __int64 LL;LL dp[2][1002][102
2015-03-26 09:40:41 439
原创 507C (DFS)
//给一颗深度为H的满二叉树,从根节点开始,按照LRLRLR……的访问顺序依次访问结点,问访问到最后一层的第N个结点(出口)时,共访问了多少个结点。//分两种情况考虑://1、如果在第h层向左(右)走,而出口位于当前结点的右(左)子树时,需把当前结点的左(右)子树的所有结点全部访问才能访问其右(左)子树。//2、如果在第h层左(右)走,出口位于当前结点的左(右)子树,则问题转化为深
2015-03-26 09:39:10 717
原创 505C (DP)
//题意:30001个岛屿自西向东依次编号为0-30000,输入n个编号,表示该岛屿上有宝藏。//从编号为0处出发向东跳,第一次跳的距离为d。设上一次跳的距离为L(L>0),则当前跳的距离为L-1(L>1)或L或L+1//输出最多能拿的宝藏数目//以p[i]表示第i个岛屿的宝藏数目,dp[i][j]表示跳了距离j到第i个岛屿所获得的最多宝藏数,则状态转移方程为:// dp
2015-03-26 09:37:25 408
原创 poj 3237 tree
题意:一棵树n个节点,三种操作:1、改变一条边的权值。2、查询节点a到b的路径中的边的最大值。3、将a到b路径上所有边的权值变为其相反数。 第4道树链剖分。。剖分后,用线段树点更新实现操作1,即可,对于操作3,设区间内原最大值、最小值为a、b,则区间内的数都乘以-1之后,最大值、最小值变为:-b,-a。这里用线段树成段更新操作即可。注意的是使用lazy标记的时候,应当使用异或运算,否则
2015-03-25 14:57:52 321
原创 线段树成段更新
hdu 1698n个hook,每个初始化为1,m次操作,更新区间[x,y]的值为z,操作完毕后求所有hook之和。用g++超时。。。#includeusing namespace std;#define maxn 100000#define lson i<<1,l,m#define rson i<<1|1,m+1,rint sum[maxn<<2],col[ma
2015-03-24 21:23:53 409
原创 SGU 118 Digital Root
定义f(n)为n各位数字之和,如果n是个位数,则n的根是f(n),否则n的根为f(n)的根现在给出n个数Ai,求出A1*A2*…*AN + A1*A2*…*AN-1 + … + A1*A2 + A1 这个式子的根一个数的所有位数之和与这个数模9同余。根据同余定理即可证明:http://www.cnblogs.com/zhixingqiezhixing/archive/2012/04/03/
2015-03-24 19:52:07 400
原创 SGU 117 Counting
n个数,求其M次幂能够被k整除的数的个数。(n,k,m快速幂求解即可。或者可以将k和那n个数都分解质因数。如果某个数的所有质因数的个数都不小于k的相应的质因数个数,则该数可被k整除#include#includeusing namespace std;#define LL __int64int pow(int a,int b,int k){ int ans=1;
2015-03-24 19:04:30 421
原创 SGU 116 Index of super-prime
题意:素数序列2,3,5,7,……中,若其序号也为素数,则称之为超级素数。给出一个整数n(n 预处理打表筛出不超过10000的超级素数后,问题即为完全背包问题。可以参看http://blog.csdn.net/insistgogo/article/details/8579597设f[j]表示j最少能被表示成f[j]个超级素数之和。f[j]=min(f[j],f[j-sprime[i
2015-03-24 12:39:03 483
原创 SGU 115 Calendar
水题。直接模拟即可,或者可以用蔡勒公式: #includeusing namespace std;int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int main(){ int d,m,i,s; scanf("%d%d",&d,&m); if(d12||d>day[m]) puts("Impo
2015-03-23 19:34:12 363
原创 Codeforces 509E
/*给一个字符串,统计元音字母AEIOUY在子串中出现的比例之和。用数组s来存储前缀和。即s[i]表示前i个字符中元音字母个数,这样可以方便统计区间[l,r]元音字母个数。设串总长为L则有:长度为1的子串中元音字母出现的个数之和为:ans[1]=s[L]长度为2:ans[2]=ans[1]+s[L-1]-s[1]长度为3:ans[3]=ans[2]+s[L-2]-s[2
2015-03-22 22:23:56 513
原创 Codeforces 197A Plate game
纯粹的想法题啊!!!一个面积为a*b的矩形,两个人轮流往里面摆放半径为r的圆,不能重叠,轮到谁不能摆放时,另一方就赢了。输出胜者。只有两种情况。。。。。。。当矩形较短边长小于圆直径时,第一个人无法放。后者获胜。当第一个人可以放时,其一定获胜。因为其为防止对手获胜,一定将圆放在矩形中心位置,其余没有被圆覆盖的区域是对称的。 若不能摆放,则先手胜。 若可以摆放,则必然存
2015-03-22 22:19:34 990
原创 Codeforces 519E
给出26个字母的值和一个字符串,求其子串中长度大于1且首尾字母相同且除首尾字母外字母的权值之和为0的个数。扫一遍字符串,记录当前字母的前缀和,如果之前字母和当前字母相同且前缀和也相同,则说明该字母与之前字母间的字母权值之和为0。#includeusing namespace std;#define LL __int64mapm[26];char s[100005];int m
2015-03-22 22:18:25 614
原创 SGU 110 Dungeon
题意:http://hi.baidu.com/hpfdf/item/4bc71df5cc9f3dc4a835a2a9纯粹的数学题。初始一看非常麻烦,但是仔细思考后,其实并不复杂。需要注意一些细节。1、用对称式的空间直线方程(一个点,一个空间向量)来表示入射光线,然后与球的方程联立方程组,求出比例系数t1,t2,再由系数求出直线与球的交点。需要注意的是:如果表示入射光线的点为起点的话,这
2015-03-22 16:38:38 432
原创 hdu 5191 Building Blocks
问题描述看完电影后,乐乐回家玩起了积木。他已经搭好了n堆积木,他想通过调整积木,使得其中有连续W堆积木具有相同的高度,同时他希望高度恰好为H。乐乐的积木都这了,也就是说不能添加新的积木,只能移动现有的积木。他可以把一个积木从一堆移动到另一堆或者新的一堆,但是不能移动到两堆之间。比如,一次移动之后,"3 2 3" 可以变成 "2 2 4" 或者 "3 2 2 1",但是不能变成
2015-03-22 09:37:56 541 1
原创 SGU 103 Traffic Lights (最短路)
题意:http://www.cnblogs.com/yylogo/archive/2011/06/05/SGU-103.html分析:比通常的最短路问题多了个限制条件,即每个路口的颜色必须相同时才能通过,否则需要等待。不难发现,路口的颜色是与当前已经花费的时间有关。于是可以构造一个函数,根据当前所用时间来计算某个路口的颜色,以及下一次变色所需时间。 利用该函数可以计算出当
2015-03-22 08:02:30 501
MFC开发的多功能高精度计算器(含源码
2015-09-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人