[Topcoder]AvoidRoads(dp,hash)】的更多相关文章

题目连接:https://community.topcoder.com/stat?c=problem_statement&pm=1889&rd=4709 题意:给一张n*m的地图,上面有些路不能走,每次只能向左走或者向下走.问从(0,0)走到(n,m)一共有多少种走法. 动态规划,先哈希标记出所有无法走的道路,然后做DP. 转移方程: 如果(i-1,j)可以走到(i,j):dp(i,j)+=dp(i-1,j) 如果(i,j-1)可以走到(i,j):dp(i,j)+=dp(i,j-1) //…
题意:有一个n*m的方格,每一格可能为空也可能有石头,要从(1,1)走到(n,m),每次可以往右或往下走 每次走的时候都会将自己面前的所有石头向移动方向推一格,如果碰到了边界就推不过去 问方案数模1e9+7 n,m<=2e3 思路:设dp[i][j][0/1]分别为当前走到(i,j),上一次从左/上走的合法方案数 合法的转移是行坐标或列坐标连续的一段,而且受障碍物个数和当前行/列号限制 写出式子之后可以发现决策范围对于i相同或者j相同是单调的,可以用队列维护,但显然二分更好写 #include<…
题意: 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出中情.若申请通过,学生就可以在第 i个时间段去教室 di上课, 否则仍然在教室…
题目大意:对于一个序列,定义它的价值是它的所有前缀的 $\gcd$ 中互不相同的数的个数.给定整数 $n$,问在 $1$ 到 $n$ 的排列中,有多少个排列的价值达到最大值.答案对 $10^9+7$ 取模. $2\le n\le 10^6$. 一道 Div. 2 的难度 2500 的题,真的不是吹的…… 首先考虑排列的第一个数 .假如分解质因子后为 $\prod p_i^{c_i}$,那么此时排列价值的最大值为 $\sum c_i$. 为什么?因为如果 $\gcd$ 变了,那么一定变成原来 $\…
[Luogu2600]合并神犇 题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有…
题目链接:http://acm-software.hrbust.edu.cn/problem.php?id=1472 题意:给n个硬币,面值随意.问恰好凑成m元的种类数(去掉重复). dp(i,j,k)表示i个硬币,j元,最大是k时的种类数. 一开始智障记忆化dfs暴T不止,转成递推还是会T. 结果就考虑先给记忆化dfs加一些剪枝,还是T. 再给递推做一些处理,发现是因为枚举当前最大的时候,最大的l如果是j+2了,即使只有它一个,也是大于j+1了.换到这里来看,是前向着递推,那也就是说,题目所述…
[CQOI2011]放棋子 \(solution:\) 看到这道题我们首先就应该想到有可能是DP和数论,因为题目已经很有特性了(首先题面是放棋子)(然后这一题方案数很多要取模)(而且这一题的数据范围很小) 但真正实用的还是分析题目性质:这一道题我们仔细读题,可以发现每一种棋子的影响是相对独立的(即我们只需要知道这种颜色的棋子占了多少行列,而不需要知道它占的哪一行那一列)(这个可以画画图自证一下),而且每一种颜色占多少行和多少列也有方案数(我占两行两列,可以用两个棋子,也可以用三个或四个棋子)(而…
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 输入导弹依次飞来的高度(雷达给出的高度数据是 \le 50000≤50000 的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统. 输入输出格式 输入格式: 1 行,若干个整数…
#include<bits/stdc++.h>using namespace std;int dp[1000007][7][7];int cnt[1000007];int main(){    int n,m;    scanf("%d%d",&n,&m);    int x=0;    for(int i=1;i<=n;i++){        scanf("%d",&x);        cnt[x]++;    }  …
Codeforces 645E. Intellectual Inquiry 题意:给定一串字符,由前k个小写拉丁字母组成,要求在该字符串后面补上n个字符(也从前k个小写拉丁字母里面选),使得最后得到的字符串含有本质不同的子序列的数量最大. 思路:要解决这个问题,首先要解决如何求字符串本质不同的子序列的个数的问题.定义dp[i][j]表示前i个字符内,以字符j结尾的本质不同的子序列的个数.那么可推得转移式:s[i]==j时,dp[i][j] = \(\sum_{t=1}^{k}dp[i-1][t]…