【USACO 2.3】Cow Pedigrees(DP)】的更多相关文章

问n个结点深度为k且只有度为2或0的二叉树有多少种. dp[i][j]=dp[lk][ln]*dp[rk][j-1-ln],max(lk,rk)=i-1. http://train.usaco.org/usacoprob2?a=chObWjKZP9z&S=nocows /* TASK:nocows LANG:C++ */ #include<cstdio> #include<cstring> #include<algorithm> using namespace…
v种货币,求有多少种组成和为n. dp[i][j]表示前i种货币价格为j有多少种方案,dp[i][j]+=dp[i-1][j-c]. http://train.usaco.org/usacoprob2?a=jUh88pMwCSQ&S=money /* TASK:money LANG:C++ */ #include<cstdio> #include<string> #include<algorithm> #define ll long long #define f…
P.S.o(︶︿︶)o 唉~虽然这题方程不难,但题目长,代码长,我花了超过3小时!(>﹏<)悲伤辣么大~~~ 谨此题解惠及众人,hh. 题意:给定长度为M的一串颜色序列,和平面上的N个颜色隧道.要求以颜色序列的顺序通过颜色隧道.(隧道可多次使用,可交叉,互不相同.)问从源点到汇点依次通过颜色的最小距离. 解法:f[i][j]表示通过颜色序列前 i 个颜色,这次的第 i 个颜色的隧道选 j 的最小距离.枚举第 i-1 个颜色选的隧道为 k ,则:f[i][j] = min( f[i][j] ,…
题意:给你n(最多150)个点的坐标,给出邻接矩阵,并且整个图至少两个联通块,现在让你连接一条边,使得所有可联通的两点的最短距离的最大值最小. 题解:先dfs染色,再用floyd跑出原图的直径O($n^3$),然后枚举新增的边的端点O($n^2$),再分别找出到边端点距离最远的点($n$),那么添加这条边后新图的直径要么是原图直径要么就是两个端点到各自最远点的距离之和加上边的长度.每次维护最小的直径.这样总的是O($n^3$). 代码: /* TASK:cowtour LANG:C++ */ #…
按字典序输出所有在123..n之间插入'+','-',' '结果为0的表达式.. http://train.usaco.org/usacoprob2?a=jUh88pMwCSQ&S=zerosum /* TASK:zerosum LANG:C++ */ #include<cstdio> #include<string> #include<algorithm> using namespace std; #define N 15 int n; int k[N],cn…
题 Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard bowling-pin-like triangle like this: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Then the other cows travers…
题目链接 这题还是很好想的,看到\(90%\)的数据点时,我就知道要用\(n^3\)的算法(最后10分就算了吧) 然后,数据水,直接暴力\(n^3\)卡过了. 显然是道DP. 设\(f[i]\)表示第\(i\)秒获取到的最多的金币. 三重循环更新状态. 第一重枚举机器人出发时间, 第二重枚举机器人出发地点, 第三重枚举机器人停止的时间. 很容易理解,看代码一下就懂了. #include <cstdio> #include <cmath> #include <algorithm…
这题和"山区建小学"除了输入不同,其他都一样.(解析可见我的上一篇随笔) 但是,这次我对dis[][]加了一个优化,画一下图就可明白. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 5 const int N=310,M=35; 6 int s[N],f[N][M],dis[N][N]; 7 8 int mmin(int x,int y) {return x<y?x:y…
题目链接 先考虑如果只有一天,那么该怎么做. 设\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时正在睡觉时的最大体力,\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时没在睡觉时的最大体力. 则有 \[f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])\] \[f[i][j][1]=max(f[[i-1][j-1][0],f[i-1][j-1][1])\] 边界条件:\(f[1]…
题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一维状态,保存最大值和最小值. \(f[i][j][0]\)表示第\(i\)个到第\(j\)个合并后的最大值,\(f[i][j][1]\)表示最小值.如果是乘法,更新时用最大值和最小值都乘一遍就行了. 还有就是,破环成链复制一倍,这样就不用枚举砍掉哪条边了,如果结果是\(f[1][n][0]\),那么砍掉的肯定…