递推DP HDOJ 5459 Jesus Is Here】的更多相关文章

题目传送门 题意:简单来说就是sn = sn-1 + sn-2递推而来,求其中所有c字符的:∑i<j:sn[i..i+2]=sn[j..j+2]=‘‘cff"(j−i) mod 530600414 分析:一开始觉得很难下手,类似于斐波那契数列,最后的数字会很大,不能正常求解.想到试试打表找规律,结果并没有找到什么规律...最后也没想出什么来.赛后才恍然大悟,这是递推题,拿来别人的思路: 串长度len,串中字符c的个数num,串中所有字符c的位置之和sum,串中所有字符c之间的距离之和ans…
题目传送门 /* 递推DP: 如果a, b, c是等差数列,且b, c, d是等差数列,那么a, b, c, d是等差数列,等比数列同理 判断ai-2, ai-1, ai是否是等差(比)数列,能在O(n)时间求出最长的长度 */ #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; typedef long long ll…
题目传送门 /* 题意:从上到下,找最短路径,并输出路径 DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键 */ #include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue&…
题目传送门 /* 题意:把N个数分成两组,一组加起来是A,一组加起来是B,1<=A,B<=9,也可以全分到同一组.其中加是按照他给的规则加,就是一位一位加,超过一位数了再拆分成一位一位加. DP:dp[i][j]记录前i个数累加和为j的方案数,那么状态转移方程:dp[i][j+a[i]] += dp[i-1][j]; 当然,dp[i][a[i]] = 1; 然后考虑几种特殊情况:都前往S1门或S2门,方案数+1.另外,比赛时我写出正确的转移方程,结果答案输出dp[n][s1]+dp[n][s2…
题目传送门 /* 题意:给一个串,只能是0,1,?(0/1).计算格雷码方法:当前值与前一个值异或,若为1,可以累加a[i],问最大累加值 DP:dp[i][0/1]表示当前第i位选择0/1时的最大分数,那么分类讨论,情况太多,看代码,注意不可能的状态不要转移 */ /************************************************ * Author :Running_Time * Created Time :2015-8-11 15:49:03 * File N…
题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状态转移方程:dp[i][j] = min (dp[i][j], dp[i-1][k-1] + cur * (j - k + 1 - cur)); 表示k到j匹马放在第i个马棚的最小unhappy值,dp[0][0] = 0.由于黑马数是1的和,前缀sum[i]表示前i匹马黑马的个数,白马就是总个数-…
题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转移方程:dp[i][j] += dp[i-j][k] 表示最后一列是j,那么上一个状态是少了最后一列 总共i-j块砖头,倒数第二列是k块砖头.k<j, j<=i 最后累加dp[n][i], i<n因为最少要两层 dp[0][0] = 1; 还有更简单的做法,没看懂:http://m.blog…
题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; ; const int INF = 0x3f3f3f3f; ]; int main(void) //URAL 1260 Nudnik Photographer { //fr…
题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k],为了不出现负数 改为:dp[i][j+k] += dp[i-1][j] */ #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <str…
题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好像还要滚动数组,不会,以后再补 */ #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <cstring> using names…