首页 > 其他分享 >ACM预备队-week7(DP)

ACM预备队-week7(DP)

时间:2022-12-19 20:11:15浏览次数:60  
标签:10 01 int cin ACM DP 序列 include week7

1.[NOIP2005 普及组] 采药

题目链接:P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

01背包,可以利用滚动数组优化为一维。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1010;
 4 int f[N];
 5 int main()
 6 {
 7     int T,M;
 8     cin>>T>>M;
 9     for(int i=1;i<=M;i++)
10     {
11         int v,w;
12         cin>>v>>w;
13         for(int j=T;j>=v;j--)
14         {
15             f[j]=max(f[j],f[j-v]+w);
16         }
17     }
18     cout<<f[T];
19     return 0;
20 }

2.最长上升子序列

题目链接:B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

如果数据范围是1e4数量级以上,就不能用朴素算法了,O(N2)的复杂度

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=5010;
 4 int a[N],f[N];
 5 int n;
 6 int main()
 7 {
 8     cin>>n;
 9     for(int i=1;i<=n;i++)cin>>a[i];
10     for(int i=1;i<=n;i++)
11     {
12         f[i]=1;
13         for(int j=1;j<i;j++)
14             if(a[j]<a[i])
15             {
16                 f[i]=max(f[i],f[j]+1);
17             }
18     }
19     int ans=0;
20     for(int i=1;i<=n;i++)ans=max(ans,f[i]);
21     cout<<ans;
22     return 0;
23 }

 3.最大子段和:

题目链接:P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

该算法更为简便之处是忽略了对子序列的寻找比较,而是根据规律直接找出最佳答案.

对于含有正数的序列而言,最大子序列肯定是正数,所以头尾肯定都是正数.我们可以从第一个正数开始算起,每往后加一个数便更新一次和的最大值;当当前和成为负数时,则表明此前序列无法为后面提供最大

子序列和,因此必须重新确定序列首项.

首先定义一个答案,必须在数据最小值范围之外,定义S是扫描到第i个数时,前 i-1 个数的最大子段和,将子段与0比较即可,反正是玄学。。。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=2e5+10;
 4 int a[N];
 5 int main()
 6 {
 7     int res=-1e9,n,s=0;
 8     cin>>n;
 9     for(int i=0;i<n;i++)cin>>a[i];
10     for(int i=0;i<n;i++)
11     {
12         if(s<=0)s=0;
13         s+=a[i];
14         res=max(res,s);
15     }
16     cout<<res;
17     return 0;
18     
19 }

4.最长公共子序列(LCS)

题目链接:LCS - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

其中00表示不含i和j,01表示不含i但含j(这个j可能选也可能不选),10表示含i但不含j(这个i可能选也可能不选),11表示含i含j,但是,11有一个前提,就得是当a[i]==b[j]时。

00:f[i-1,j-1]           01:f[i-1,j]         10:f[i,j-1]       11:if(a[i]==b[j])f[i-1][j-1]+1

但是因为00其实就是01和10的子集,所以可以不写00,此时01和10其实不是真正意义的选与不选,但是最大值只要包括了而且没有越界,就算情况重复也不影响max值

因为此题还要输出路径,所以还得倒着来一遍。用res表示路径,注意:状态转移方程第一二步不可以颠倒

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 
 5 
 6 using namespace std;
 7 
 8 const int N = 1010;
 9 
10 int n, m;
11 char a[N], b[N];
12 int f[N][N];
13 
14 int main()
15 {
16     cin >> n >> m;
17     cin >> a + 1 >> b + 1;
18 
19     for (int i = 1; i <= n; i ++)
20         for (int j = 1; j <= m; j ++)
21         {
22             f[i][j] = max(f[i - 1][j], f[i][j - 1]);
23             if (a[i] == b[j]) f[i][j] =  f[i - 1][j - 1] + 1 ;
24         }
25     cout << f[n][m] << endl;
26 
27     string res;
28     // 一个倒序的过程
29     for (int i = n, j = m; i && j; )
30     {
31         if (a[i] == b[j]) res += a[i], i --, j --;
32         else if (f[i - 1][j] > f[i][j - 1]) i --;
33         else j --;
34     }
35 
36     reverse(res.begin(), res.end());
37 
38     cout << res << endl;
39     return 0;
40 }

 

标签:10,01,int,cin,ACM,DP,序列,include,week7
From: https://www.cnblogs.com/Zac-saodiseng/p/16992948.html

相关文章

  • 如何彻底关闭xrdp会话(vnc)(59xx端口可以被重新被分配给一个新xrdp连接)
      xrdp(xvnc)登录失败,log日志文件位于/var/log/xrdp-sesman.loglog显示[ERROR]Xserver--nodisplayinrangeisavailable很多人通过增大/etc/xrdp/sesman.ini中的......
  • DNS用的是TCP协议还是UDP协议
    DNS占用53号端口,同时使用TCP和UDP协议。那么DNS在什么情况下使用这两种协议?DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。(一)TCP与UDP简介TCP---传输控制协议,是......
  • 高性能技术整理(DPDK、SPDK、RDMA等)
    可提高性能的方式有:减少数据拷贝;使用缓存;提高查表效率(减少总条目(如大页)、哈希、排序、数组、索引等等);硬件offload(把某些事交给硬件去做);“资源池”的使用(实际上是......
  • Algorithm - DP
    0.前言关于DP我很早就想做总结性的东西。寒假要提前放假了,那么,加油吧!1.“基础DP”看似简单的算法,却能把你难死1.1区间DP1.2树形DP1.3基环树DP1.4其他......
  • 简单DP+最长上升子序列
    简单DP+最长上升子序列目录简单DP+最长上升子序列比较简单的DP1027.方格取数题解275.传纸条题解最长上升子序列AcWing1014.登山题解AcWing1012.友好城市输入格式输出......
  • 算法学习笔记(48)——状态压缩DP
    状态压缩DP连通性问题一、核心思想:核心:先放横着的,再放竖着的总方案数等于只放横着的小方块的合法方案数。如何判断当前方案是否合法?所有剩余位置,能否填充满竖着......
  • wordpress外贸独立站商城 如此简单
      2020年开始突然之间外贸独立站就火起来的,很过公司转型做B2C。外贸商城无独有偶选择wordpress,wordpress用来搭建独立站,搭建wordpress商城,都是非常不错的选择当然你也......
  • 2021年蓝桥杯A组省赛-回路计数 【状压dp】
    题面分析单源最短Hamilton路径的状压dp模板题。\(dp[i][j]\)表示终点为\(j\),经过的点集状态为\(i\)的方案数。假设状态由\(k\)转移到\(j\)。当前计算\(dp[i][j]\),那么i......
  • 【量化LDPC】基于量化技术的LDPC译码算法的研究与matlab仿真
    1.本LDPC采用的量化方案      改进方案如下所示:  公式,的范围是由一个统计范围得到的,但是在实际中,根据信道的不同,可能存在多种可能,这里,我们的考虑的方案......
  • dremio CommandPool简单说明
    CommandPool实际上是一个线程池的处理,官方实现了好几种线程池主要作用限制并行请求以以及job的运行定义优先级任务特点任务基于优先级以及提交时间进行自然排序当线程空闲......