首页 > {dp入门}

{dp入门}

之前一直比较恐惧dp的题,暑假之前好好从头补一下。

 

题目链接:HihoCoder - 1037 

数字三角形

dp[i][j]表示到第i层第j个房间时累计收集到的最大值,从上到下记忆化搜索即可

状态转移:dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+m[i][j];

 1 #include 
 2 #include 
 3 #include 
 4 using namespace std;
 5 int n;
 6 int m[110][110];
 7 int dp[110][110];
 8 int main()
 9 {
10     while(scanf("%d",&n)!=EOF)
11     {
12         memset(m,0,sizeof(m));
13         memset(dp,0,sizeof(dp));
14         int ans=0;
15         for(int i=1;i<=n;i++)
16             for(int j=1;j<=i;j++)
17                 scanf("%d",&m[i][j]);
18         for(int i=1;i<=n;i++)
19             for(int j=1;j<=i;j++)
20                 dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+m[i][j];
21         for(int i=1;i<=n;i++)
22             ans=max(ans,dp[n][i]);
23         printf("%d
",ans);
24     }
25 }
View Code

 

题目链接:HihoCoder - 1038 

01背包

dp[j]=max(dp[j-c[i]]+v[i],dp[j]);

 1 #include 
 2 #include 
 3 #include 
 4 using namespace std;
 5 const int maxn=520;
 6 int n,m;
 7 int dp[100110];
 8 int c[maxn],v[maxn];
 9 int main()
10 {
11     scanf("%d%d",&n,&m);
12     for(int i=0;i)
13         scanf("%d%d",&c[i],&v[i]);
14     for(int i=0;i)
15         for(int j=m;j>=c[i];j--)
16             dp[j]=max(dp[j-c[i]]+v[i],dp[j]);
17     printf("%d
",dp[m]);
18 }
View Code

 

题目链接:HihoCoder - 1043

完全背包

和01背包相比只是j的顺序变了

本质是为了01背包只能选一件,完全背包可以多选

即01背包时的dp[ j-c[i] ]是上一次遍历时求出的,而完全背包用的则是本次遍历求出的值

 1 #include 
 2 #include 
 3 #include 
 4 using namespace std;
 5 const int maxn=520;
 6 int n,m;
 7 int dp[100110];
 8 int c[maxn],v[maxn];
 9 int main()
10 {
11     scanf("%d%d",&n,&m);
12     for(int i=0;i)
13         scanf("%d%d",&c[i],&v[i]);
14     for(int i=0;i)
15         for(int j=c[i];j<=m;j++)
16             dp[j]=max(dp[j-c[i]]+v[i],dp[j]);
17     printf("%d
",dp[m]);
18 }
View Code

 

 题目链接:https://nanti.jisuanke.com/t/20

如果之前的位置可以到达当前位置,更新最小值

if(j+x[j]>=i)  dp[i]=min(dp[i],dp[j]+1);  (j

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 using namespace std;
 6 const int maxn=110;
 7 int dp[maxn],x[maxn];
 8 int n;
 9 int main()
10 {
11     while(scanf("%d",&n)!=EOF)
12     {
13         memset(dp,0x3f,sizeof(dp));
14         dp[0]=0;
15         for(int i=0;i)
16         {
17             scanf("%d",&x[i]);
18             for(int j=0;j)
19             {
20                 if(j+x[j]>=i)
21                     dp[i]=min(dp[i],dp[j]+1);
22             }
23         }
24         printf("%d
",dp[n-1]);
25     }
26 }
View Code

 

 题目链接:https://nanti.jisuanke.com/t/28

背包变形了一下,竟然又不会。。。

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 using namespace std;
 6 int n,m;
 7 long long dp[1010];
 8 int main()
 9 {
10     scanf("%d",&n);
11     m=(1+n)*n;
12     if(m%4)
13     {
14         puts("0");
15         return 0;
16     }
17     m/=4;
18     dp[0]=1;
19     for(int i=1;i<=n;i++)
20         for(int j=m;j>=i;j--)
21             dp[j]+=dp[j-i];
22     printf("%lld
",dp[m]/2);
23 
24 }
View Code

 

题目链接:HihoCoder - 1055

树dp,,转换成树上的背包??

dp[u][j]以u为根涂j个桶的最大值。。。

 1 #include 
 2 #include 
 3 #include 
 4 using namespace std;
 5 const int maxn=110;
 6 struct Edge
 7 {
 8     int v;
 9     int nex;
10 }e[maxn<<1];
11 int head[maxn];
12 int cnt=0;
13 int dp[maxn][maxn];
14 void add(int u,int v)
15 {
16     e[cnt].v=v;
17     e[cnt].nex=head[u];
18     head[u]=cnt++;
19 }
20 int n,m;
21 void dfs(int u,int pre)
22 {
23     for(int i=head[u];i!=-1;i=e[i].nex)
24     {
25         int v=e[i].v;
26         if(v==pre) continue;
27         dfs(v,u);
28         for(int j=m;j>=2;j--)
29             for(int k=1;k)
30             dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
31     }
32 
33 }
34 int main()
35 {
36     scanf("%d%d",&n,&m);
37     memset(head,-1,sizeof(head));
38     cnt=0;
39     for(int i=1;i<=n;i++)
40         scanf("%d",&dp[i][1]);
41     for(int i=1;i)
42     {
43         int u,v;
44         scanf("%d%d",&u,&v);
45         add(u,v);
46         add(v,u);
47     }
48     dfs(1,0);
49     printf("%d
",dp[1][m]);
50 }
View Code

 

 

转载于:https://www.cnblogs.com/yijiull/p/6913957.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 题目:正则表达式匹配 请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。 示例 1:...

  • 题意:就是在n*m的格子中放“炮”(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状压,但数据范围有100),这篇博客些的很好(传送门),我们定义dp[i][j][k]代表前i行我们有j列式有2个棋子,有k列是一个棋子,那么我们空的列的个数...

  • 虽然也是一道dp的入门题,但就是想不到,或者说不会实现。dp还是要多做题。 链接:https://www.luogu.org/problemnew/show/P1164   我们可以设dp[i][j]表示以考虑完第i件,恰好消费j元的方案数。那么dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]],也就是讨论第i件点...

  • bzoj1260,懒得复制,戳我戳我 Solution: 这种题目我不会做qwq,太菜了区间打牌(dp) 用f[l][r]表示从l到r最少需要染几次色。状态转移方程: 1.(f[l][r]=min(f[l][i],f[i+1][r]) (l<=i

  • 题目背景 博弈正在机房颓一个叫做《模拟城市2.0》的游戏。 2048年,经过不懈努力,博弈终于被组织委以重任,成为D市市委书记!他勤学好问,励精图治,很快把D市建设成富强民主文明和谐的美好城市。为了进一步深化发展,他决定在海边建立一个经济开发区。 题目描述 已知开发区的建筑地块是一个n×nn imes nn×n的矩形,而开发...

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...