程序设计与算法(郭炜)
小兵955
这个作者很懒,什么都没留下…
展开
-
015 复杂的整数划分问题(超时)
#include #include #include #include <string.h>#define INF 0x3f3f3f;using namespace std;int n = 1,k;int dp1[60][60][60];int dp2[60][60];int dp3[60][60];struct node{int a,b,c;};node ans[3600];node ans2[3600];int main() {int y = 0;while原创 2021-04-09 16:38:38 · 113 阅读 · 0 评论 -
017:分蛋糕
思路:动态规划dp[w][h][m] = 宽为w,高为h的蛋糕切m刀后最大快蛋糕面积的下限递推公式:dp[w][h][m] = min(切的第一刀为横的最优解,切的第一刀为竖的最优解)切的第一刀为横的最优解 = min(s(i))(1<=i<=h-1)(s(i)表示切完第一刀后上边的蛋糕的高度为i的情况的最优解)切完第一刀后上边的蛋糕的高度为i的情况的最优解 =min(max(dp[w][i][k]),dp[w][h-i][m-k])(k表示分配到上面的蛋 糕的刀数)以此类推原创 2021-04-09 00:33:26 · 203 阅读 · 0 评论 -
poj3624:Charm Bracelet
思路:动态规划+滚动数组int j;dp[i] = 前j个物品中选出重量小于i的部分,所选出部分总价值的最大值边界条件:j=0时dp[i] = 0;递推公式:如果i-a[i]>=0: dp[i] (j==j1) = max(dp[i] (j == j1-1),dp[i-a[j].weight] (j = j1-1));否则:dpi = dpidp生成顺序:dp数组元素按j从小到大,i从大到小的顺序生成#include <cstdio>#include &原创 2021-04-08 20:24:43 · 95 阅读 · 0 评论 -
百练 2755:神奇的口袋
思路:动态规划dp[i][j] = 前j个物品中选出重量和为i的物品的选法数目递推公式:如果i-a[j]>=0:dp[i][j] = dp[i][j-1] + dp[i-a[i]][j-1];否则:dp[i][j] = dp[i][j-1];初始条件:dp[0][j] = 1;(0<=j<=n);dp[i][0] = 0;(1<=i<=40);dp生成情况:阴影部分表示已知,空白表示未知。多个箭头从阴影格子指向空白格子表示由多个已知推导出一个未知由原创 2021-04-08 17:43:37 · 160 阅读 · 0 评论 -
百练1088:滑雪
思路:动态规划dp[i][j] = 从该点出发能到达的点的个数的最大值递推公式:如果四周没有比该点低的点:dp[i][j] = 1;否则:dp[i][j] = max(dp[ix][jx]+1);//((ix,jx)为周围的点中比点(i,j)低的 点)dp生成顺序:低的点的dp应该先生成#include <cstdio>#include <iostream>#include <algorithm>#define INF 0x3f3f3f;原创 2021-04-08 16:55:31 · 117 阅读 · 0 评论 -
poj 1661 Help Jimmy
错误思路:定义:dp[i][j] = 从坐标为i,j的点下落到地面的最短时间递推公式:如果有板子:设(i1,jx),(i2,jx)分别为下一个板子的左端点和右端点dp[i][j] = min(dp[i1][jx]+(i-i1),dp[i2][jx]+(i2-i))+(j-jx);如果没有板子:如果j>max:dp[i][j] = 无穷大(表示无法到达)否则:dp[i][j] = j;dp数组生成顺序:生成dp[i][j]前,点(i,j)下面的板子应当先生成——》简化为:j比较原创 2021-04-08 00:07:40 · 80 阅读 · 0 评论 -
012:拦截导弹
思路:动态规划dp[i] = 以a[i]为最后拦截的导弹的情况中最多导弹的情况递推公式:dp[i] = max(dp[j]+1)(0<j<i并且a[j]>=a[i])边界条件:dp[0] = 1;记忆数组生成过程:可知道:dp数组应按i从小到达的顺序生成#include <cstdio>#include <iostream>#include <string>#include <math.h>#include <a原创 2021-04-07 13:19:32 · 196 阅读 · 0 评论 -
014:最佳加法表达式
思路:运用动态规划设原始数字为s的字符串,下标从1开始定义:dp[i][j] = 前i个数插入j个加号后形成的式子的结果的最小值递推公式:dp[i][j] = min(dp[k][j-1]+num(k+1,i))(k=j到i-1)边界条件:dp[i][0] = num(1,i);...原创 2021-04-07 13:09:21 · 300 阅读 · 0 评论 -
poj1458:Common Subsequence
思路:动态规划dp[i][j] = s1的前i个和s2的前j个的公共子序列长度递推公式:if s1[i-1] = s2[j-1]:dp[i][j] = dp[i-1][j-1]+1;else:dp[i][j] = max(dp[i][j-1],dp[i-1][j]);(证明:1、dp[i][j]显然不小于dp[i][j-1]和dp[i-1][j]2、用反证法可得dp[i][j]不同时大于dp[i][j-1]和dp[i-1][j]故等式成立)初始情况:dp[i][0] = 0;dp[原创 2021-04-06 20:44:17 · 109 阅读 · 0 评论