求找dp茬
查看原帖
求找dp茬
175846
Y_Kirito楼主2021/8/18 19:52

我的代码(20分):

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005;
int a[N][N],f[2][N],ans[N];
signed main()
{
	ios::sync_with_stdio(false);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			cin>>a[i][j];
	for(int i=1;i<=n;++i)
		ans[i]=ans[i-1]+a[i][1];
	for(int j=2;j<=m;++j)
	{
		f[0][1]=ans[1]+a[1][j],
		f[1][n]=ans[1]+a[n][j];
		for(int i=2;i<=n;++i)
			f[0][i]=max(ans[i],f[0][i-1])+a[i][j];
		for(int i=n-1;i>=1;--i)
			f[1][i]=max(ans[i],f[1][i+1])+a[i][j];
		for(int i=1;i<=n;++i)
			ans[i]=max(f[0][i],f[1][i]);
	}
	cout<<ans[n];
	return 0;
}

老师的:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1005;
ll f[N][N];
ll a[N][N];
ll up[N],down[N];//从上面过来和从下面过来 
int main()
{
	ios::sync_with_stdio(false);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
		f[i][1]=f[i-1][1]+a[i][1];
	for(int j=2;j<=m;j++)
	{
		for(int i=1;i<=n;i++)
		{
			up[i]=f[i][j-1]+a[i][j];
			if(i>1)
				up[i]=max(up[i],up[i-1]+a[i][j]);
		}
		for(int i=n;i>=1;i--)
		{
			down[i]=f[i][j-1]+a[i][j];
			if(i<n)
				down[i]=max(down[i],down[i+1]+a[i][j]);
		}
		for(int i=1;i<=n;i++)
			f[i][j]=max(up[i],down[i]);
	}
	cout<<f[n][m];
	return 0;
}
2021/8/18 19:52
加载中...