程序设计与算法(郭炜)
小兵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 · 157 阅读 · 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 · 282 阅读 · 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 = dpi dp生成顺序: dp数组元素按j从小到大,i从大到小的顺序生成 #include <cstdio> #include &原创 2021-04-08 20:24:43 · 136 阅读 · 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 · 212 阅读 · 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 · 158 阅读 · 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 · 116 阅读 · 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 · 242 阅读 · 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 · 367 阅读 · 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 · 143 阅读 · 0 评论
分享