[计数问题dp]子数列的个数】的更多相关文章

http://www.51nod.com/tutorial/course.html#!courseId=15 解题关键:主要是一种思想 $dp[i] = dp[i - 1]*2$ 如果a[i]不在之前出现 $dp[i] = dp[i - 1]*2 - dp[j - 1]$,如果a[i]最近在j的位置出现过. #include<bits/stdc++.h> using namespace std; typedef long long ll; ll mod=1e9+; ll a[],have[],…
看到有这么道算法题在博客园讨论,算法eaglet和邀月都已经设计出来了,花了点时间读了下,学到点东西顺便记录下来吧. 题目是从1...n的数列中,找出总和为n的连续子数列. 这里先设好算法中需要用到的关键变量: s:目标子数列的第一个元素 k:目标子数列的长度 那么目标子数列可以表示为(s, k) 1. naive算法(n^2) 最笨的,但是最容易的想到的方法,就是穷举所有的子数列: for s = 1 to n for k = 1 to n-s+1 if sum(s, k) == n outp…
例如:[3, 3, 2, 2, 2, 4, 3, 5, 4, 6, 3]=>2,2,2,4;4,6 结果为2     [3, 3, 2,3, 2, 2, 4, 3, 5, 4, 6, 3]=>2;2,2,4;4,6 结果为3 实现思路: 将数组取余转换为01数组[3, 3, 2, 2, 2, 4, 3, 5, 4, 6, 3]=>[1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1] 算出连续为0的个数就是偶数列的个数 , , , , , , , , , , }; int[]…
今天去牛客网看了看 包含一 这道题,一开始没看清,以为它要统计 1~n 所有数中数字 '1' 出现的总次数,也就是说,若 n == 11,则 ans = 4:而按照题目的原意 ans 应该为 3.看错题意后还是挣扎了好久,具体的调试过程也不想回忆叙述了,先贴上按照我一开始理解的意思的代码吧,虽然没有题目让我测,但我和自己写的暴力法对拍过,应该没问题的. #include<cstdio> #include<cstring> #include<vector> #includ…
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1231 直接递推. 在保存最大值的时候同时保存有多少条到达最大值的路径,注意第一行第一列的情况即可. 别忘了 取模. #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ; int dp[maxn][maxn],p[maxn][max…
题面 题解 (本篇文章深度剖析,若想尽快做出题的看官可以参考知名博主某C202044zxy的这篇题解:https://blog.csdn.net/C202044zxy/article/details/109141757) 在起码了解了背包DP后,我们来做这道题 既然每种物品最大可占据 i*i 的空间,设  那么  和  两种情况肯定是不同的 ,而且应该可以分开处理 由于  时 i 的范围很小,可以在一个处理到一半的背包上(即处理了[sq+1,n]的背包dp数组)继续跑(背包大小 * 物品数),所…
http://codeforces.com/problemset/problem/11/D 题目大意:给你n个点,m条边,找该图中有几个换 思路:定义dp[i][j]表示i是圈的集合,j表示该集合的终点,定义起点为这些走过的点里面最小的 //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace std; #define LL long long #define ALL(a) a.begi…
还是可以想出来的题目 不过考场上没有想出来 要 引以为戒. 初看觉得有点不可做 10分给到了爆搜. 考虑第一个特殊情况 B排列为1~m. 容易发现A排列中前m个数字 他们之间不能产生交换 且 第k个数字要交换到后面的m+1~n这些数字的时候 k~m的数字都要进行交换才行. 那么直接枚举有多少个数字到后面了 组合数可以解决 考虑剩下的那些空位怎么办. 其实就是要求出 \(f_i\) 其表示满足题目条件的i个数的排列的个数. 考虑递推 容易发现\(f_0=1,f_1=1\) 对于\(f_i\)考虑第…
<!DOCTYPE html> <html> <head> <title></title> <meta charset=utf-8> <script> var a=[-1,2,4,-3,5]; var maxSum=0,currentSum=0; for(var i=0;i<a.length;i++){ currentSum+=a[i]; if(currentSum<0){ currentSum=0; } if…
题目: 定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的.牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列. 如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2 解题思路: 解答这道题最重要的是思路清晰,只要了解了步骤就会很好解决.排序子序列为非递增或者非递减,很多同学在这个非递增.非递减问题上很纠结,注意:非递减…