日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

{dp入门}

發(fā)布時(shí)間:2023/11/27 生活经验 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 {dp入门} 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前一直比較恐懼dp的題,暑假之前好好從頭補(bǔ)一下。

?

題目鏈接:HihoCoder - 1037?

數(shù)字三角形

dp[i][j]表示到第i層第j個(gè)房間時(shí)累計(jì)收集到的最大值,從上到下記憶化搜索即可

狀態(tài)轉(zhuǎn)移:dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+m[i][j];

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 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\n",ans);
24     }
25 }
View Code

?

題目鏈接:HihoCoder - 1038?

01背包

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

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 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<n;i++)
13         scanf("%d%d",&c[i],&v[i]);
14     for(int i=0;i<n;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\n",dp[m]);
18 }
View Code

?

題目鏈接:HihoCoder - 1043

完全背包

和01背包相比只是j的順序變了

本質(zhì)是為了01背包只能選一件,完全背包可以多選

即01背包時(shí)的dp[ j-c[i] ]是上一次遍歷時(shí)求出的,而完全背包用的則是本次遍歷求出的值

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 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<n;i++)
13         scanf("%d%d",&c[i],&v[i]);
14     for(int i=0;i<n;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\n",dp[m]);
18 }
View Code

?

?題目鏈接:https://nanti.jisuanke.com/t/20

如果之前的位置可以到達(dá)當(dāng)前位置,更新最小值

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

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 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<n;i++)
16         {
17             scanf("%d",&x[i]);
18             for(int j=0;j<i;j++)
19             {
20                 if(j+x[j]>=i)
21                     dp[i]=min(dp[i],dp[j]+1);
22             }
23         }
24         printf("%d\n",dp[n-1]);
25     }
26 }
View Code

?

?題目鏈接:https://nanti.jisuanke.com/t/28

背包變形了一下,竟然又不會(huì)。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 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\n",dp[m]/2);
23 
24 }
View Code

?

題目鏈接:HihoCoder - 1055

樹dp,,轉(zhuǎn)換成樹上的背包??

dp[u][j]以u(píng)為根涂j個(gè)桶的最大值。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <bits/stdc++.h>
 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<j;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<n;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\n",dp[1][m]);
50 }
View Code

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/yijiull/p/6913957.html

總結(jié)

以上是生活随笔為你收集整理的{dp入门}的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。