40分求助!
查看原帖
40分求助!
1023793
yaodiguoan楼主2024/1/14 11:52
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define FOR(i,j,n,k) for(int i=(j);i<=(n);i+=k)
#define ROR(i,j,n,k) for(int i=(j);i>=(n);i-=k)
const int upint=1e6+10;
const double downdouble=1e-6;
int n,m,map[200][200],dp[200][200],way[200][200][20],len;
int max(int x,int y){
	return (x>y?x:y);
}
void dfs(int x,int y){
	map[x][y]=0;
	if(x==0&&y==0) return;
	dfs(way[x][y][0],way[x][y][1]);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(),cout.tie();
	cin>>n>>m;
	memset(map,0,sizeof(map));
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>map[i][j];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(i==1&&j==1){
				dp[i][j]=map[i][j];
				 continue;
			}
			else if(i==1){
				dp[i][j]=map[i][j]+dp[i][j-1];
				way[i][j][0]=1;
				way[i][j][1]=j-1;
				continue;
			}else if(j==1){
				dp[i][j]=map[i][j]+dp[i-1][j];
				way[i][j][0]=i-1;
				way[i][j][1]=j;
				continue;
			}
			way[i][j][0]=way[i][j][1]=0;
			dp[i][j]=map[i][j]+max(dp[i][j-1],dp[i-1][j]);
			if(dp[i][j-1]>dp[i-1][j]) way[i][j][0]=i,way[i][j][1]=j-1;
			else way[i][j][0]=i-1,way[i][j][1]=j;
		}
	}
	len+=dp[n][m];
	dfs(n,m);
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(i==1&&j==1){
				dp[i][j]=map[i][j];
				 continue;
			}
			else if(i==1){
				dp[i][j]=map[i][j]+dp[i][j-1];
				way[i][j][0]=1;
				way[i][j][1]=j-1;
				continue;
			}else if(j==1){
				dp[i][j]=map[i][j]+dp[i-1][j];
				way[i][j][0]=i-1;
				way[i][j][1]=j;
				continue;
			}
			way[i][j][0]=way[i][j][1]=0;
			dp[i][j]=map[i][j]+max(dp[i][j-1],dp[i-1][j]);
			if(dp[i][j-1]>dp[i-1][j]) way[i][j][0]=i,way[i][j][1]=j-1;
			else way[i][j][0]=i-1,way[i][j][1]=j;
		}
	}
	cout<<len+dp[n][m];
	return 0;
}


https://www.luogu.com.cn/record/list?pid=P1006&user=1023793

2024/1/14 11:52
加载中...