挑战程序设计竞赛(第2版)
小兵955
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
013:Zipper
思路: 动态规划 dp[i][j] = 用s1的前i个字符和s2的前j个字符,能否形成s3的前i+j个字符 (字符串的下标从1开始) 边界条件: dp[0][0] = 1; dp[i][0] = (s1[i]==s3[i])(1<=i<=s1.length()-1); dp[0][j] = (s1[j]==s3[j])(1<=j<=s2.length()-1); 递推公式: 当s1[i]==s3[i+j]时: p[i][j] = max(dp[i - 1][j], dp[i][j])原创 2021-04-07 21:23:22 · 485 阅读 · 1 评论 -
POJ 3616: Milking Time
1、将时间区间按开始时间从早到晚排序 2、定义dp[i] =以0-i的任务为任务总量, 到目前任务的截至时间前的最大效益值是多少 当一定要选择a[i]时,dpi = max(dp[i],dp[j]+a[j].eff);(a[j].end<=a[i].start) 当一定不选择a[i]时,dpi = max(dp[j])(a[j].end<a[i].end) 综上所述,dp[i] = max(dpi,dpi); #include <cstdio> #include <cstrin原创 2021-04-02 09:43:06 · 127 阅读 · 0 评论 -
POJ 2385: Apple Catching
借鉴了别人的思路: 1、dp[i][j] = 第i秒走了移动j次所接到的苹果的数目 2、dp[i][j] = max(dp[i-1][j-1]+dp[i-1][j])+(第i秒接到的苹果数目) #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include&l原创 2021-04-01 17:39:40 · 184 阅读 · 0 评论 -
POJ 2229: Sumsets
分析: 1、动态规划 2、主要是找规律: 若n为奇数,则组合中一定有1,将所有组合的1去掉,就变成了n-1的所有组合,所以 dp[n] = dp[n-1] 若n为偶数,则:若是有1,则必定有两个1,将所有组合的两个1去掉,就变成了n-2的所有组合;若是没有1,则所有组合中的所有数都是2的倍数,将所有组合中的数除以2,就编程了n/2的所有组合。所以:dp[n] = dp[n-2]+dp[n/2] #include <cstdio> #include <cstring> #include原创 2021-04-01 16:04:49 · 141 阅读 · 0 评论 -
POJ 3176: Cow Bowling
思路: 1、动态规划: 2、记忆数组定义和递推式 设dp[i][j] = 从第0行到达该位置所走过的数的和的最大值 i0 : dp[0][0] = a[0][0] i>0: j0 : dp[i][j] = dp[i-1][j]+a[i][j] j==i : dp[i][j] = dp[i-1][j-1]+a[i][j]; j>0&&j<i : dp[i][j] = max(dp[i-1][j-1]+a[i][j],dp[i-1][j]+a[i][j]); #in原创 2021-04-01 14:32:51 · 122 阅读 · 0 评论 -
POJ 3262: Protecting the Flowers
思路: 1、将母牛排序(排序的方法没怎么看懂) 2、遍历,计算(注意不能两重循环,否则会超时) 问题: 排序的方法不是很理解 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include<map> #include<set> #incl原创 2021-03-31 23:58:48 · 113 阅读 · 0 评论 -
POJ 1862: Stripies
思路: 每次找最大的两个数来合并,直到合并到只剩一个 问题:如何证明 有点坑,用C++能过,用G++就过不了 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include<map> #include<set> #include<原创 2021-03-31 22:12:57 · 225 阅读 · 0 评论 -
POJ 3040; Allowance
思路: 1、用sort将硬币按面值从大到小排列 2、先将面值大于等于c的硬币处理掉 3、对于面值小于c的硬币: (1)按从大到小的顺序将钱加到接近c但不超过c (2)按从小到大的顺序将钱加到刚好比c大 问题:如何证明这样做得到的周数就是最多的? #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include&原创 2021-03-31 20:50:21 · 169 阅读 · 0 评论 -
POJ 1017: Packets
思路: 先处理边长为6、5、4、3的物品 再用边长为2的物品补空缺 再用边为1的物品补空缺 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include<map> #include<set> #include<math.h>原创 2021-03-31 19:44:29 · 191 阅读 · 0 评论 -
POJ 2393: Yogurt factory
思路: 贪心算法 贪心的规则是:第i周要送出的牛奶交给0-i周中(生成价格加储存价格)最低的周数生产 int main(){ int n,s; scanf("%d %d",&n,&s); int del[n]; int cost[n]; int i; for(i=0;i<n;i++){ scanf("%d %d",&cost[i],&del[i]); } long long sum = 0; int j; for(i=0;i<n;i++){原创 2021-03-31 18:21:31 · 101 阅读 · 0 评论 -
POJ 3190: Stall Reservations
思路: 1、读入数据,将奶牛的相关数据存在数组中,按开始时间从前到后排列 2、定义最小堆(位于根上的奶牛的结束时间最早)(用于找到已经使用结束的牛棚。若用数组存储每个牛棚的使用结束时间,再找结束时间最早的牛棚的方法会超时) 3、将第一头奶牛放入最小堆,遍历数组 若堆中结束时间的最早奶牛的结束时间小于当前奶牛的开始时间,将堆的根弹出,将当前奶牛压入堆 否者(堆为空或堆中结束时间的最早奶牛的结束时间大于当前奶牛的开始时间),所需的牛棚数量加1,将当前奶牛压入堆 想不通的问题: 1、为什么数组要按奶牛开始时间从前原创 2021-03-31 13:35:36 · 172 阅读 · 0 评论 -
POJ 1328: Radar Installation
思路: 思路:利用贪心算法 从左往右安雷达,每次都将雷达安在所能安的位置中的最右边的位置 根据题意,该位置为以未被雷达覆盖的岛屿为圆心的圆与海岸线的交点中的第一个右交点 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include<map> #i原创 2021-03-30 20:08:59 · 178 阅读 · 0 评论 -
POJ 2376: Cleaning Shifts
思路: 使用贪心算法 贪心的规则是: 每次选取所有起始时间在起始班次之前的母牛中 结束时间最靠后的母牛 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include<map> #include<set> using namespace原创 2021-03-30 15:35:05 · 191 阅读 · 0 评论 -
AOJ 0525: Osenbei
思路: 行的规模较小,列的规模较大 对行和列分别进行处理: 1、先对行进行深度优先搜索,遍历对行翻转处理后的所有可能 2、对行翻转处理后的的每一种可能进行处理,遍历每一列,若该列为正多反少,不翻转,反之翻转 3、计算行列翻转后的每一种可能的正面朝上的烧饼的数量,找到最大值 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm&原创 2021-03-30 14:40:21 · 133 阅读 · 0 评论 -
POJ 3050: Hopscotch
思路: 1、遍历网格中的所有点,以遍历到的点为起点进行深度优先搜索,深度优先搜索递归6次后返回 2、用set来存储所得到的数,以达到去重的目的 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include<map> #include<set原创 2021-03-30 13:37:59 · 260 阅读 · 0 评论 -
POJ 3187: Backward Digit Sums
思路: 使用函数next_permutation()按字典序从大到小的顺序进行全排列,每次更新排列后都检查当前排列是否符合所给条件,若符合输出 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include<iostream> #include<map> using namespace原创 2021-03-30 12:53:18 · 115 阅读 · 0 评论 -
POJ 2718: Smallest Difference
思路:对数进行全排列,然后切割,计算两数之差的绝对值,不断更新结果 使用algorithm中的next_permutation()函数: 用法: next_permutation(start,end);(start和end分别为数组的头和尾指针) 作用是将更新数组中元``素的排列顺序,新排列的字典序是所有字典序大于原排列的排列中最小的那个,即不存在排列x,使得字典序大小为为: 原排列<x<新排列 若是下一个排列存在,即存在比当前排列字典序更大的排列存在,返回值为true 若下一个排列不存在,返回原创 2021-03-30 11:13:16 · 213 阅读 · 0 评论
分享