随笔分类 -  HZOJ/POJ刷题记录

2022寒假伊始,算法虐我千百遍,我待算法如初恋
摘要:题面: 解题思路: 有两个点必须记住,一条船只能做两个人,且两个人重量相加不能超过最大负载量。 因此,第一步,我们先对n个人的体重进行从小到大排序,然后从第一个开始,如果第一个可以装的下且小于最大负载量,则向后搜寻小于等于剩下重量空余承重的最大值作为与第一个坐同一艘船的人。设置一个bool类型数组把 阅读全文
posted @ 2023-01-07 21:53 阿纳先森 阅读(83) 评论(0) 推荐(0)
摘要:题面 数组含义:dp[i][j]位于(i,j)的元素向左延长的长度状态转移:minn= min(dp[k][j],minn) 向上遍历,加入满足最小长度的矩形 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include 阅读全文
posted @ 2023-01-05 22:29 阿纳先森 阅读(42) 评论(0) 推荐(0)
摘要:题面: 解题思路: 本题是一个经典的动态规划的题目。定义动态规划数组dp,dp[i]的含义是子串str[0…i]至少需要切割几次,才能把str[0…i]全部切成回文子串。那么dp[len-1]就是最后的结果。 从左往右依次计算dp[i]的值,i 初始为0,具体计算过程如下: 1、假设 j 处在 0 阅读全文
posted @ 2022-12-31 11:10 阿纳先森 阅读(67) 评论(0) 推荐(0)
摘要:题面: 解题思路: 用一个三维的数组来记录,dp[b][x1][x2],b表示走的步数,表示两条路径上的某个点的横纵坐标相加之和,x1表示第一条路的某一点的横坐标,y1表示第一条路的某一点的纵坐标;x2表示第二条路的某一点的横坐标,y2表示第二条路的某一点的纵坐标。存在x1+y1=x2+y2=b(2 阅读全文
posted @ 2022-12-29 20:18 阿纳先森 阅读(60) 评论(0) 推荐(0)
摘要:题面: 解题思路: 首先定义状态dp[i][j]表示序列ai和序列bj的最长公共上升子序列的长度 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> 阅读全文
posted @ 2022-12-29 13:19 阿纳先森 阅读(62) 评论(0) 推荐(0)
摘要:题面: 解题思路: 最大的子矩阵和要么在前面,要么在后面,要么在中间,取两个变量m,max,m为不断累加的值,累加到小于等于0时就置零,保证后面加到的数不受前面影响。在累加过程中由max存最大的m值。 对矩阵的数据处理: a[i][j] += a[i][j-1];// a[i][j]保存第i行1~j 阅读全文
posted @ 2022-12-25 21:41 阿纳先森 阅读(121) 评论(0) 推荐(0)
摘要:HZOJ 发愤涂墙 动态规划题面: 解题思路: 找到递推规律:f[i]=f[i-1]+f[i-2] 代码: #include<iostream> #include<algorithm> using namespace std; int main(){ long long n; cin>>n; long long f[50]={ 阅读全文
posted @ 2022-12-24 13:18 阿纳先森 阅读(33) 评论(0) 推荐(0)