4-7终极无敌DP乱秀

DP练习赛

这里写图片描述
维持10h的DP练习赛终于结束了,由于鄙人学艺不精,只AC了两道题,特此记录;
声明:所有主人公都由我的儿子mht出演


T1 免费馅饼

天上掉馅饼本指天空中降落类似馅饼那样的即免费又好吃的食物,泛指在自然生活中会无缘无故的发生一些可以满足人们欲望的物质或财富上面的事情;现在也贬指那些坐享其成,成天不务实际的人在假想一些不可能发生的事情,等待出现奇迹,天上怎么可能会掉馅饼。

有一天, 小王同学正走在路上,忽然天上掉下大把大把的馅饼(哈哈哈。。。。)。这个只能说小王同学的人品太好,这馅饼就掉落在他身旁的10米范围内。所以小王同学马上去接馅饼,因为掉在地方的馅饼就不能吃了。他只能在这个10米范围内接馅饼。由于小王同学是一个非常优秀的Oier,但他不是一个优秀的运动员,所以他每秒钟只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标:

为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时小王站在5这个位置上,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问小王最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
Input
输入数据有多组。每组数据的第一行为以正整数n(0 < n < 100000),表示有n个馅饼掉在这条小径上。在结下来的n行中,每行有两个整数x,T(0 < T < 100000),表示在第T秒有一个馅饼掉在x点上。同一秒钟在同一点上可能掉下多个馅饼。n= 0时输入结束。
Output
每一组输入数据对应一行输出。输出一个整数m,表示小王最多可能接到m个馅饼。

一开始我想的是fj收苹果的做法,但是很明显的,因为数据有十万,所以一定会超时。所以就换了一种方法,类似数字三角形这样的方法;
设一个二维数组,每个纵列表示这个坐标随时间的变化,横行就是10个坐标,表示,因为mht的速度小于等于1,所以每一个点就一定是这个点上面右边,上面,上面左边的最大值得到,就是:dp[i][j]=max(max(dp[i-1][j],dp[i-1[j+1]),max(dp[i-1][j],dp[i-1][j+1])+xb[i][j];
再加上该点的馅饼数;
一层层求出最大值,最后输出;

T2 蛋糕

话说某个幸运的小伙伴X拿到了kevin女神送的蛋糕,然而他的吃法非常奇特,他独创了两种吃蛋糕的办法:一、一次吃一整个蛋糕;二、一次吃k个蛋糕。
那么,当蛋糕数量为x1到x2之间时,一共能有几种不同的吃法呢?
由于答案很大,输出结果mod 1000000007的值
Input
第一行有两个正整数t,k(1<=t,k<=100000) ,其中t表示数据的组数。
接下来t行,每行两个数x1, x2(1<=x1<=x2<=100000)。
Output
共t行,每行一个正整数x,表示蛋糕数量在x1-x2之间时,一共能有几种不同的吃法,结果对(10^9+7)取模
Sample Input
3 2
1 3
2 3
4 4
Sample Output
6
5
5

这道题其实也挺水,就是可以看成简化版的走楼梯问题,一次要么走k步,要么走1步,状态转移方程就是dp[i]=1(i<=k),dp[i]=dp[i-1]+dp[i-k](i > k);
然后算的是总方法数,所以就要%一个素数
但是其中会出现负数,所以要小心;

T3 水果

有n个水果, 每个水果都有两个属性值ai表示美味程度, bi表示能量值, 现在要求选出一个或多个水果, 使得选出的水果的ai和与bi和的比例是k 问在这种清形可能出现的情况下ai的和最多是多少, 如果这样的情形不存在输出 -1
Input
第一行包含两个整数n, k (1 ≤ n ≤ 100, 1 ≤ k ≤ 10). 第二行为 n个整数 a1, a2, …, an (1 ≤ ai ≤ 100) — 水果的美味值. 第三行包含 n integers b1, b2, …, bn (1 ≤ bi ≤ 100) —水果的能量值. Fruit number i has taste ai and calories bi.
Output
如果无解输出-1.
否则输出满足条件的ai累加和
Examples
Input
3 2
10 8 1
2 7 1
Output
18
Input
5 3
4 4 4 4 4
2 2 2 2 2
Output
-1

因为水果的美味值之和要与水果的能量值成正比,所以a[i]的总和要与k倍的b[i]总和相等,所以就是说
把所有的b[i]都乘以k,所以就可以得出两个总和要相等,所以说就可以做dp了,选择取与不取,要在两值相等的情况下得到最大值;可以做背包里,但是因为存在负数,所以要偏移,实际上要偏移1000(数据太水,偏移100也能过)

T4 括号染色

这题,没有做过,转载转载

有一个字符串 s. 这个字符串是一个完全匹
配的括号序列.
在这个完全匹配的括号序列里,每个括号都有一个和它匹配的括号 你现在可以给这个匹配的括号序列中的括号染色,且有三个要求:
每个括号只有三种情况,不上色,上红色,上蓝色.
每对括号必须只能给其中的一个上色,且必须给一个上色;
相邻的两个不能上同色,可以都不上色;
求满足条件的括号序列染色的方法数, 这个数值会比较大,只需要 mod 1000000007 (10^9 + 7).

以下题解

先每对对括号进行记录。
dp的时候,当左右两边括号是匹配的时候,就为两个括号染色,然后就把状态转移到它们里面的括号串了
当不匹配的时候,也就是这个串是由多个匹配串并列而成的,那么就是dfs的思想了,为第一对括号染色,并求这对括号的子括号串的染色方案数,然后dp后面的那些串,直到dp到只剩一个串,并根据乘法原则把各种方案累计起来。(这样做是因为染色是和两边的括号颜色有关系的,而我们在dp前必须确定这个串两端的括号颜色。
递归的停止是当括号只有两个时,返回可能的染色数。

T5 回文串

现有一个字符串 s = s1s2… s|s| of length |s|, 由小写字符组成. 现在有 q 次查询, 每次查询给两个整数 li, ri (1 ≤ li ≤ ri ≤ |s|). 每次查询你的程序要给出此字符串的子串 s[li… ri]有多少个回文串.
String s[l… r] = slsl + 1… sr (1 ≤ l ≤ r ≤ |s|) is a substring of string s = s1s2… s|s|.
字符串 t 叫 回文串的条件是, 如果这个字符串从左往右读与从右往左读是一样的. Formally, if t = t1t2… t|t| = t|t|t|t| - 1… t1.

这题是区间dp,枚举起点和长度,大的区间的最优值由小区间的最优质值递;

T6 完美子串

给你一个长度为n的长字符串,“完美子串”既是它的前缀也是它的后缀,求“完美子串”的个数且统计这些子串的在长字符串中出现的次数
Input
在一行中有长字符串s1s2…s|s| (1 ≤ |s| ≤ 105) — string s. 且字符串只包含大写字符。
Output
在第一行中, 输出整数 k (0 ≤ k ≤ |s|) — 表示“完美子串”的个数 s. 然后输出k 行,在每一行中输出两个整数li ci. li ci 分别表示前li个字符为“完美子串” 和 该完美子串在原串中出现的次数, 以 li递增为序输出 li ci
Example
Input
ABACABA
Output
3
1 4
3 2
7 1
Input
AAA
Output
3
1 3
2 2
3 1

先用kmp的预处理,用next[next[i]]这样的形式不断计算,知道i就i==0,就可以算出所有完美子串的位置,再用递归算出个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值