DP专题——数塔问题
来源自这篇文章:【朝夕的ACM笔记】动态规划-数塔问题
- 知乎 (zhihu.com)
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=998244353; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int a[210][210]; int dp[210][210];
void solve2() { int m,n; std::cin>>m>>n; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { std::cin>>a[i][j]; } } memset(dp,-0x3f,sizeof(dp));
dp[m][n/2+1]=a[m][n/2+1]; dp[m][n/2+2]=a[m][n/2+2]; dp[m][n/2]=a[m][n/2]; for(int i=m-1;i>=1;i--) { for(int j=1;j<=n;j++) { dp[i][j]=std::max({dp[i+1][j+1],dp[i+1][j],dp[i+1][j-1]})+a[i][j]; } } int ans=-0x3f3f3f3f; for(int i=1;i<=n;i++) { ans=std::max(ans,dp[1][i]); } std::cout<<ans<<"\n"; }
int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); return 0; }
|
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=998244353; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int a[1010][1010]; int dp[1010][1010];
void solve2() { int r; std::cin>>r; for(int i=1;i<=r;i++) { for(int j=1;j<=i;j++) { std::cin>>a[i][j]; } } memset(dp,-1,sizeof(dp)); dp[1][1]=a[1][1]; for(int i=2;i<=r;i++) { for(int j=1;j<=i;j++) { dp[i][j]=std::max(dp[i-1][j],dp[i-1][j-1])+a[i][j]; } } int ans=0; for(int i=1;i<=r;i++) { ans=std::max(ans,dp[r][i]); } std::cout<<ans<<"\n"; }
int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); return 0; }
|
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=998244353; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi; int dp[12][12][12][12];
int num[12][12];
void solve2() { int n; std::cin>>n; int a,b,c; while(std::cin>>a>>b>>c && (a||b||c)) { num[a][b]=c; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { for(int l=1;l<=n;l++) { dp[i][j][k][l]=std::max({dp[i-1][j][k-1][l],dp[i][j-1][k][l-1],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l]})+num[i][j]+num[k][l]; if(i==k && j==l) dp[i][j][k][l]-=num[i][j]; } } } } std::cout<<dp[n][n][n][n]; }
int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve2(); return 0; }
|
#include<bits/stdc++.h> using ll=long long; const int N=2e4+10; const int MAXN=1e5+10; const int INF=0x3f3f3f3f; const int mod=998244353; typedef std::pair<int,int> pii; typedef std::pair<double,int> pdi;
int dp[55][55][55][55]; int num[55][55];
void solve2() { int m,n; std::cin>>m>>n; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { std::cin>>num[i][j]; } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=m;k++) { for(int l=j+1;l<=n;l++) { dp[i][j][k][l]=std::max({dp[i-1][j][k-1][l],dp[i][j-1][k][l-1],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l]})+num[i][j]+num[k][l]; } } } }
std::cout<<dp[m][n-1][m-1][n]; }
int dp2[60][60]; int num2[105][105]; void solve3() { int m,n; std::cin>>m>>n; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { std::cin>>num2[i][j]; } }
for(int k=1;k<=n+m-2;k++) { for(int i=m;i>=1;i--) { for(int j=m;j>i;j--) { dp2[i][j]=std::max({dp2[i][j],dp2[i-1][j],dp2[i][j-1],dp2[i-1][j-1]}); dp2[i][j]+=num2[i][k-i+2]+num2[j][k-j+2]; } } } std::cout<<dp2[m-1][m]; } int main(){ std::ios::sync_with_stdio(false),std::cin.tie(nullptr); int t=1; while(t--)solve3(); return 0; }
|
附上一道强化版题目的链接:T35377 大教室中传纸条 -
洛谷 | 计算机科学教育新生态 (luogu.com.cn)