题解
MasterSPP
这个作者很懒,什么都没留下…
展开
-
滑雪
输入5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9输出25原题链接:P1434 [SHOI2002]滑雪采用记忆化搜索以下是C代码#include <stdio.h>#include<stdlib.h>#include<math.h>int dx[4] = { 0,0,1,-1 };int dy[4] = { 1,-1,0,0 };int n, m.原创 2021-04-12 00:07:38 · 66 阅读 · 0 评论 -
数字金字塔—动态规划
思路:使用动态规划自底向上运算状态转换方程:f[i][j] = max{ f[i+1][j], f[i+1][j+1] } + a[i][j]如果题目数据中金字塔的行数太多,可以使用register,提高读写速度,也就是代码里注释掉的部分输入573 88 1 02 7 4 44 5 2 6 5输出30以下是C代码#include <stdio.h>#include<stdlib.h>#include<math.h>//#includ原创 2021-04-11 11:27:21 · 427 阅读 · 0 评论 -
矩阵相乘问题
首先要明白基础的线代知识:两个矩阵相乘之后得到的矩阵的行为前面一个矩阵的行,列为后面一个矩阵的列,复杂度与第一个矩阵的列也有关例如:一个pq的矩阵A和一个qr的矩阵B的乘积是一个新的p*r的矩阵C输入630 3535 1515 55 1010 2020 25输出15125...原创 2021-04-10 23:51:32 · 222 阅读 · 0 评论 -
背包问题
0-1背包参考讲解:0-1背包讲解1和0-1背包问题讲解2状态转换方程:dp[i][j] = max{ dp[i-1][j], dp[i-1][j-w[i]] + v[i] }输入4 82 33 44 55 6输出10下面是C代码#include<stdio.h>int n, w;int W[100] = { 0 };int V[100] = { 0 };int dp[100][100];int max(int a, int b){ return原创 2021-04-10 15:46:39 · 83 阅读 · 0 评论 -
最大子段和问题
方法一:暴力求解, 时间复杂度O(n^2)#include <stdio.h>#include <math.h>#include <stdlib.h>#define maxlenth 101int maxSubseqSum(int a[], int n) { int maxsum = 0, temsum; for (int i = 1; i <= n; i++)//子序列起始位置 { temsum = 0; for (int j = i;原创 2021-04-10 11:08:50 · 185 阅读 · 0 评论 -
最长递增子序列
任务描述给定一个序列,求这个序列的最长上升子序列的长度,并输出这个最长上升子序列,题目保证,最长上升子序列只有一个。相关知识最长上升子序列输入格式第一行输入一个n,代表序列长度第二行输入n个值,代表这个序列0<n<1000-1000<序列内的数<1000输出格式第一行输出一个数,代表最长上升子序列的长度。第二行打印这个子序列。输入85 2 8 6 3 6 5 7输出42 3 6 7#include <stdio.h>#incl原创 2021-04-09 22:33:17 · 64 阅读 · 0 评论 -
排队接水
排队接水这题主要是想介绍a[i] = x*1001 + i这种巧妙的存储数据的方式既能保存数据本身,又能保存数据的位置,很巧妙,有些地方应该会大有用处#include <bits/stdc++.h>using namespace std;int main(){ int n, x, a[1000005]; cin>>n; for(int i = 1; i <= n; i++){ cin>>x; a[i] = x*1001 + i;//既能保存原创 2021-03-13 09:08:46 · 55 阅读 · 0 评论 -
路标设置
题目背景B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最大距离定义为该公路的“空旷指数”。题目描述现在政府决定在公路上增设一些路标,使得公路的“空旷指数”最小。他们请求你设计一个程序计算能达到的最小值是多少。请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。输入格式第1行包括三个数L、N、K,分别表示公路的长转载 2021-03-12 22:40:49 · 271 阅读 · 0 评论 -
跳石头
题目链接第一步,先定一个mid,作为是否移走石头的标准第二步,如果前方的石头a[i]距离我的位置a[now]小于mid,就记下一个石头,但移走石头后我的位置是不变的,变的是我能看到的第一块石头的位置。当我前方能看到的第一块石头(移走后或者没移走后)距离我的位置a[now]大于mid时, 我才会从now变到i位置(即我能看到的第一块石头的位置)。第三步,判断最终移走的石头是否多了,如果多了, 就把mid调小一点,否则就调大一点在这里插入代码片#include<bits/stdc++.h>原创 2021-03-12 13:07:22 · 60 阅读 · 0 评论 -
P1873 砍树
伐木工人米尔科需要砍倒M米长的木材。这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林。不过,米尔科只被允许砍倒单行树木。米尔科的伐木机工作过程如下:米尔科设置一个高度参数H(米),伐木机升起一个巨大的锯片到高度H,并锯掉所有的树比H高的部分(当然,树木不高于H米的部分保持不变)。米尔科就行到树木被锯下的部分。例如,如果一行树的高度分别为20,15,10和17,米尔科把锯片升到15米的高度,切割后树木剩下的高度将是15,15,10和15,而米尔科将从第1棵树得到5米,从原创 2021-03-11 22:46:28 · 87 阅读 · 0 评论 -
烦恼的高考志愿--lower_bound解法
##烦恼的高考志愿输入4 3513 598 567 689500 600 550输出32首先需要理解lower_bound的用法,参考lower_bound和upper_bound用法#include<bits/stdc++.h>using namespace std;int a[1000005], b[1000005];int main(){ int m, n, sum = 0; cin>>m>>n; a[0] = -1000000原创 2021-03-10 13:14:50 · 299 阅读 · 3 评论 -
A-B数对
A-Bfor(int i = 1; i <= n; i++){ cin>>a[i]; m[a[i]]++;}if(c > 0) for(int i = 1; i <= n + c; i++) sum += m[a[i]] * m[a[i+c]];else for(int i = 1; i <= n; i++) sum += m[a[i]];原创 2021-03-09 18:24:46 · 873 阅读 · 0 评论