洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using namespace std; +; ll a[maxn];//存放输入的数据 ll f[maxn];//用来递推 int main() { ll n; cin>>n; ;i<=n;i++) scanf("%lld",&a[i]);//输入数据 ;i<=n;i++)…
题目链接:P1006 传纸条 PS:伤心,又想不出来,看了大神的题解 AC代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,f[][],a[][]; int main() { ll i,j,k; cin>>n>>m; ;i<=n;++i) ;j<=m;++j) cin>>a[i][j]; f[][]=a[][]+a[][];//不管怎样都会经过…
一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影响) @4.买主件和附件2 @5.买主件和两个附件 2.因为要求的是重要度*价格,那么数组就直接存重要度*价格,最后输出f[n]就是答案 附件不一定刚好有两个,可是如果没有的话数组的值是空的,也就好像虚无缥缈的灵魂一样,用了也没关系 3.主件和附件要构建一层联系,一个个输入物品时肯定混杂着主件和附件…
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列. 输出格式: 输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少.子段的最小长度为1. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 说明 [样例说明]2 -4 3 -1 2 -4 3 [数据规模与约定] 对于…
1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7…
题目链接: 最大子段和 题目分析: 动态规划O(n)求解,设f[i]表示以i为终点的最大子段和 分两种情况: 若f[i-1]>0,则显然f[i]=f[i-1]+a[i](a[i]必须包含在内) 若f[i-1]<=0,则f[i]=a[i](加上f[i-1]只会让答案更小,对答案没有贡献) 扫一遍就好了,好像有别的一大堆做法(线段树?)不过这个比较优秀 代码: #include<bits/stdc++.h> #define MAXN (200000+5) using namespace…
题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace std; ],zhu[],t[]; struct student { int s; int number; ]; }f[][]; int main() { std::ios::sync_with_stdio(false); int m,v,n;//m总重量,v总阻力,n物品数 cin>>m>…
题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,1000,所以其实没必要把多重背包用二进制优化成01背包,直接一个个拆开就好了 2.建立数组f[2000],用来f[j]=1表示存在重量为j这种可能,f[j]=0则表示不存在这种可能 建立数组a[2000],用来把多重背包一个个拆开 比如说我们输入的是 0 0 那a就是{,} 数组f其实是用了"桶&qu…
先上题目: P1004 方格取数 下面上ac代码: ///如果先走第一个再走第二个不可控因素太多 #include<bits/stdc++.h> #define ll long long using namespace std; ll f[][][][]; ll a[][]; int main() { ios::sync_with_stdio(false); ll n,xx,yy,zz; cin>>n; &&!(xx==&&yy==&&…
题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll num[+]; ll p[]; ll f[][][][]; int main() { ios::sync_with_stdio(false); ll n,m;//n格子数,m牌数 cin>>n>>m; ;i<…
洛谷题面传送门 首先推式子: \[\begin{aligned} ans&=\sum\limits_{i=A}^B\sum\limits_{j=1}^i\{\dfrac{i}{j}\} \end{aligned} \] 考虑差分,设 \[f(n)=\sum\limits_{i=1}^n\sum\limits_{j=1}^i\{\dfrac{i}{j}\} \] 那么 \[ans=f(B)-f(A-1) \] 考虑如何计算 \(f(n)\): \[\begin{aligned} f(n)&=…
题目链接: 普通版: https://www.luogu.org/problemnew/show/P1028 数据加强版: https://www.luogu.org/problemnew/show/P2240 中间插一段,奇怪了,我明明想到的是最好的那种递推方法,结果写着写着忘记了,写成最差的递推方法 所以中间插一段被我遗忘的好方法 这个也是这题的书上的答案 #include<bits/stdc++.h> using namespace std; ]; int main() { int n;…
有n张牌,求出至少有k张牌连续是正面的排列的种数.(1=<k<=n<=100) Toss is an important part of any event. When everything becomes equal toss is the ultimate decider. Normally a fair coin is used for Toss. A coin has two sides head(H) and tail(T). Superstition may work in…
题目:假如有A,B两个人,在一个m*n的矩阵,然后A在(1,1),B在(m,1),A要走到(m,n),B要走到(1,n),两人走的过程中可以捡起格子上的数字,而且两人速度不一样,可以同时到一个点(哪怕这个点离A很近,离B很远),现在A,B起码相遇于一个点点,相遇点的数字A,B都得不到,求最后A,B总数字之和的最大值 B. Working out Summer is coming! It's time for Iahub and Iahubina to work out, as they both…
Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数.其中,蜂房的结构如下所示. Input 输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50). Output 对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行. Sample Input 2 1 2 3 6 Sample Output 1 3 //思路: /…
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内.   Output 对于每个测试实例,输出可能得到的最大…
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你一个 n 行m 列 的格子图 一只马从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行. 题意很简单暴力dp的思路也很简单但是数据很恶心虽然远古一点,但毕竟是省选题 1 ≤ n ≤ 50,2 ≤ m ≤ 10^9 不过还是给了我们一点提示:n这么小? 总之我们先找出转移式对于每一个点…
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2048 全错=全不匹配 设当前全错的个数是dp[n] 那么前(n-1)个全错的话,第n个数就可以从前(n-1)个任意挑选一个进行交换,得到的即是全错的: dp[n] += (n-1)*dp[n-1] 也可以从下面这种情况样获得全错的排列: 在前(n-1)个中挑出(n-2)个全错,仅有一个对的情况,第n个数只需要和这个对的交换就能得到全错的结果. 可供挑选的(n-2)个全错的情况,在(n-1)个数中,有(…
题目来源 https://www.luogu.org/problemnew/show/P1115 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数 NN ,表示了序列的长度. 的整数 A_iAi​ ,描述了这段序列. 输出格式: . 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 说明 [样例说明] ,该子段为 3,-1,23,−1,2 . [数据规模与约定] 对于 40\%40% 的数据,有 …
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列. 输出格式: 输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少.子段的最小长度为1. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 说明 [样例说明]2 -4 3 -1 2 -4 3 [数据规模与约定] 对于…
P1115 最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列. 输出格式: 输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少.子段的最小长度为1. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 说明 [样例说明]2 -4 3 -1 2 -4 3…
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iAi​,描述了这段序列. 输出格式: 一个整数,为最大的子段和是多少.子段的最小长度为11. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 说明 [样例说明] 2,-4,3,-1,2,-4,3中,最大的子段和为4,该子段为3,-1,2. [数据规模与约定] 对于…
https://www.luogu.org/problemnew/show/P1115 简单到不想说……dp[i]表示以i为结尾的最大连续和的值. 那么答案肯定就是最大值了.求一次max就可以了. 仔细想想连线性的空间都不需要了. #include<bits/stdc++.h> using namespace std; #define ll long long int n; ]; ]; int main(){ scanf("%d",&n); ;i<n;i++)…
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iAi​,描述了这段序列. 输出格式: 一个整数,为最大的子段和是多少.子段的最小长度为11. 输入输出样例 输入样例#1: 复制 7 2 -4 3 -1 2 -4 3 输出样例#1: 复制 4 说明 [样例说明] 2,-4,3,-1,2,-4,32,−4,3,−1,2,−4,3中,最大的子段和为4,该子…
https://www.luogu.org/problem/show?pid=1115#sub 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列. 输出格式: 输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少.子段的最小长度为1. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3…
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NNN,表示了序列的长度. 第二行包含NNN个绝对值不大于100001000010000的整数AiA_iAi​,描述了这段序列. 输出格式 一个整数,为最大的子段和是多少.子段的最小长度为111. 输入输出样例 输入 #1 7 2 -4 3 -1 2 -4 3 输出 #1 4 说明/提示 [样例说明] 2,−4,3,−1,2,−4,32,-4,3,-1,2,-4,32,−4,3,−1,2,−4,3中,最…
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iA i ​ ,描述了这段序列. 输出格式: 一个整数,为最大的子段和是多少.子段的最小长度为11. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 import java.util.Scanner; public class zuidaziduanhe { pub…
经典的线性DP例题,用f[i]表示以第i个位置结尾的最大连续子段和. 状态转移方程:f[i]=max(f[i],f[i-1]+a[i]); 这里省去了a数组,直接用f数组读数据,如果f[i-1]<0,那么f[i]肯定不会加上它,f[i]=a[i],相当于是从此时的i位置重新计算最大连续子段和:如果f[i-1]>=0,那它对f[i]来说是有贡献的,要加上它. 代码很短: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const…
先上题目链接:P1616 疯狂的采药 然后放AC代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll f[]; ll timee[]; ll w[]; int main() { ll t,m; cin>>t>>m;//t总时间,m总草药 //time时间,w价值 ;i<=m;i++) { scanf("%lld",&timee[i]); scan…
题目链接:P1060 开心的金明 基本思路: 基本上和01背包原题一样,不同点在于这里要的是最大重要度*价格总和,我们之前原题是 f[j]=max(f[j],f[j-v[i]]+p[i]); 那么这里直接改成f[j]=max(f[j],f[j-v[i]]+v[i]*p[i]);就好了 其中f[j]代表的意义是当给定初始金币为j时重要度*价格的最大总和,也就是价值那里在这题变成了重要度*价格 再比较一下看看? 原题:f[j]=max(f[j],f[j-v[i]]+p[i]); 这题:f[j]=ma…