摘要:
题意:N个数(N2#include3#definelsonl,m,rt=a&&rb||r>1;21update(lson,a,b,k,c);22update(rson,a,b,k,c);23}2425intquery(intl,intr,intrt,inta)26{27intadd=0;28for(inti=1;i>1;35if(a<=m)36{37returnquery(lson,a)+add;38}39else40returnquery(rson,a)+add;41}4243intmain()44{45intn,q,type,a,b,k,c;46while 阅读全文
摘要:
hdu 2089 不要62题意:给出两个数,求区间内不带4和62的数的个数。(PS:62是连续的两位)思路:dp[i][0]表示前i位不含不吉利数的个数(如i=4,则范围为0~9999,下同)dp[i][1]表示前i位不含不吉利数且首位是2的数的个数dp[i][2]表示前i位含不吉利数的数的个数。则有dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1]dp[i][1] = dp[i-1][0]dp[i][2] = dp[i-1][2] * 10 + dp[i-1][0] + dp[i-1][1]预处理得到dp数组然后从高往低逐位求答案。例子,如数5678按0~49995 阅读全文
摘要:
题意:在一些括号中找到一个序列,里面的括号都两两配对。求序列最长长度。dp[i][j]为i~j的最大括号数,考虑第i个括号,有两种情况:①不管i直接算dp[i][j] = dp[i + 1][j];★②枚举i+1~j,找到和i匹配的右括号,有dp[i][j] = max(dp[i][j],dp[i + 1][k - 1] + 2 + dp[k + 1][j])。递归写法:1#include2#include3#defineN10545intdp[N][N],len,vis[N][N];6chars[N];78intmax2(intx,inty)9{10returnx>y?x:y;11}1 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686题意: 一个n*n矩阵(内为小于100的正整数),求从左上角走到右下角,再从右下角走到左上角,每格只能走一次,两线路不相交,将走过格子内的数目相加,求最大值。思路:可转化为两条线路同时从左上角出发到右下角。如图,黄框内的数字为第几步能到达该框。令dp[k][i][j]表示第k步走到的两个点(i,k-i)、(j,k-j) (i不等于j,因为不能交叉)则有状态转移方程dp[k][i][j] = max(dp[k-1][i-1][j-1],dp[k-1][i-1][j],dp[k-1][i][j-1 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2870题意:一个矩形由字符a、b、c、w、x、y、z组成,其中w可以代替a、b,x可以代替b、c,y可以代替a、c,z可以代替a、b、c。求由相同组成的最大内矩形面积。思路:方法与hdu 1505一样,不过需要开三个数组a[]、b[]、c[]保存相同字符的区域。1#include2#include3#defineN100545inta[N][N],b[N][N],c[N][N],ha[N][N],hb[N][N],hc[N][N],l[N],r[N];6charss[N];7intmax2(intx 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506题意:给出n个数(如图代表矩形的高,矩形的宽统一为1)。问合并成的图形中,内置最大矩形面积是多少?思路:a[i]代表每个矩形的高;以第i个矩形的高为内置矩形的高,l[i]表示该内置矩形的左边,r[i]代表右边。问题转化为求l[i]和r[i]。求l[i]和r[i]用类似于链表的方法,详见代码。1#include2usingnamespacestd;34constintN=100005;56intl[N],r[N];7longlonga[N];8longlongmax2(longlongx,lon 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978思路:从右到左、从下到上递推。设dp[i][j]为dp[i0][j0]可达的点,则dp[i0][j0] += dp[i][j];PS:每个点可达的区域都是一个三角形,如图:1#include2#include3#defineN10545inta[N][N],dp[N][N];67intmain()8{9intn,m,t;10scanf("%d",&t);11while(t--)12{13scanf("%d%d",&n,&m);14 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577题意:给一串只含大小写字母的字符串,问从键盘打出这个字符串最小需要按多少次按键?(可用Shift和Cap lock,初始Cap lock是关闭的,最终的状态Cap lock也必须是关闭的)思路:利用DP可以很方便地解决。dp[i][]表示打印完第i个字符最少需要的按键次数。dp[i][0]时表示打印完第i个字符Cap lock是关闭的。dp[i][1]时表示打印完第i个字符Cap lock是开启的。很容易得出状态转移方程。具体:第i个字母是大写: dp[i][0] = min(dp[i-1][ 阅读全文
摘要:
链接:http://poj.org/problem?id=2287题意:田忌赛马。田忌与king各有n匹马,每匹对应一个整数,整数大的马赢。田忌赢一场赚200,输一场亏200,平手不赚不亏。求田忌最多能赚多少。思路:贪心。1、两数列排序。对田忌的每一匹马,从king的马中找出一匹小于田忌的该匹马且数值最大的。共能找出win对。2、然后,在剩余的马中,king的马总是>= 田忌的马,从中找出相等的对数,same.。3、根据win和same即可得到答案。PS:题目中没说马对应的数值为正数。也即是可是负数。1#include2#include3#include4#include5usingna 阅读全文