感觉题解真的看得有点懵,玄关
查看原帖
感觉题解真的看得有点懵,玄关
1252442
lucy2012楼主2024/7/10 21:05

帮忙解答2-3个问题就给关。

我觉得不一定一列都是一个方向啊,可能dp[1][j]到dp[i][j]是往下走,而dp[i+1][j]到dp[n][j]是向上走 这样也不会重复。(其他问在代码注释中)

#include<bits/stdc++.h>
using namespace std;
long long a[1010][1010],dp[1010],s[1010],x[1010],n,m;
int main(){   
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
    		cin>>a[i][j];
		}
	}
	dp[1]=a[1][1];
	for(int i=2;i<=n;i++){
		dp[i]=dp[i-1]+a[i][1];
	}
	for(int i=2;i<m;i++){//这里为什么是i<m 
		x[1]=dp[1]+a[1][i];
		s[n]=dp[n]+a[n][i];
		for(int j=2;j<=n;j++)
		    x[j]=max(dp[j],x[j-1])+a[j][i];
		for(int j=n-1;j>=1;j--) 
		    s[j]=max(dp[j],s[j+1])+a[j][i];
		for(int j=1;j<=n;j++) 
		    dp[j]=max(x[j],s[j]);
	}
	dp[1]+=a[1][m];//为什么要加?下面循环也是 
	for(int i=2;i<=n;i++){
		dp[i]=max(dp[i],dp[i-1])+a[i][m];
	}
	cout<<dp[n];
	return 0;
}
2024/7/10 21:05
加载中...