【USACO 3.2】Stringsobits (dp)】的更多相关文章

题意:求第k大的最多有l个1的n位二进制. 题解:dp[i][j]表示长度为i最多有j个1的二进制有多少种,则有: 状态转移:dp[i][j]=dp[i-1][j]+dp[i-1][j-1],即第i位放1或者0. 边界条件:dp[0][i]=1,dp[i][0]=1. 长度为n,最多m个1的二进制可以分为: 以0开始的一部分,共有dp[n-1][m]个, 和以1开始的一部分,共有dp[n-1][m-1]个. 如果dp[n-1][m]≥k,说明第k大的就在0开始的那一部分的第k大的, 否则就是1开…
太水的dp没啥好说的.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include <set> #include <vector> #include <map> usin…
题目: 洛谷4933 分析: (自己瞎yy的DP方程竟然1A了,写篇博客庆祝一下) (以及特斯拉电塔是向Red Alert致敬吗233) 这里只讨论公差不小于\(0\)的情况,小于\(0\)的情况进行复读机即可(注意不要重复计算公差为\(0\)的情况). 用\(dp[i][j]\)表示结尾为第\(i\)个数,公差为\(j\)的长度不小于\(2\)的非降等差数列的方案数(单独\(1\)个数的情况公差不确定不好处理,最后给答案加上\(n\)就行了). 那么对于\(i\),枚举所有\(j(j<i\)且…
题意:要求二叉树中每个节点的子节点数为0或2,求有N个节点高度为M的不同的二叉树有多少个(输出 mod 9901 后的结果). 解法:f[i][j]表示高度为i的有j个节点的二叉树个数.同上题一样,把高度为i的树分解成1个根节点和2棵子树,子树中有一棵高度为i-1,较高,枚举其结点数,另一颗较矮,高度为0~i-2(用sum存),结点数也可知道了.分别左子树和右子树较高,便*2.还有2子树一样高,同为i-1时的情况.==>也可转化为一棵高i-1,另一棵高0~i-1,*2后减去多算的两子树同高 i-…
题意:n个数中不能同时选连续m个或以上,问方案数. 解法:f[i][j]表示从前i个中选,到第i个已经连续选了j个.j!=0时,  =f[i-1][j-1] ; j=0时, =f[i-1][0~m-1] ; 优化1:f[i][m]存f[i-1][0~m-1],就不用多for一重. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 6 long long…
题意:求取到总和为K的倍数的糖果的最大值. 解法:用模K的余数作为一个维度,f[i][j]表示在前i种糖果中取到总颗数模K余j的最大总颗数. 注意--f[i-1][j]要正常转移,而其他要之前的状态存在才能状态转移. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 int a[110],f[11…
这题题意与前面的"判断整除"重复了.具体解释可看我这篇的博文. http://www.cnblogs.com/konjak/p/5936738.html 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 #define N 10010 7 #define K 110 8 int a…
题意:有N瓶酒,不能连续喝>=3瓶的酒,问能喝的最大的酒量. 解法:同前一题相似,可以f[i][j]表示前i瓶中连续喝了j瓶的最大酒量.1.f[i][0]=f[i-1][3] ; 2.i=1或2时,f[i][j]=f[i-1][j-1]+a[i];   3. f[i][3]=mx;也可以只用f[i]. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream&…
题意:输出最长下降路径的长度. 解法:f[i][j]表示结尾于(i,j)的最长的长度.由于无法确定4个方位已修改到最佳,所以用递归实现. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 #define Maxn 110 7 8 int a[Maxn][Maxn],f[Maxn][Maxn]; 9 i…
题意:N天可买卖2次股票,问最大利润. 解法:f[i]表示前 i 天买卖一次的最大利润,g[i]表示后 i 天. 注意--当天可以又买又卖,不要漏了这个要求:数据较大. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 #define N 100010 8 #define INF 1000010…