正整数n,m \left ( 1\leq n,m\leq 10^{3} \right )(1≤n,m≤10
3
),接下来n行,每行m个整数,代表map_{ij} \left( -10^3 \leq map_{ij} \leq 10^{3}\right )map
ij
(−10
3
≤map
ij
≤10
3
)。
输出描述:
输出一个整数,表示答案。
示例1
输入
复制
3 3
-2 -3 3
-5 -10 1
0 30 -5
输出
复制
7
示例2
输入
复制
2 2
1 1
1 1
输出
复制
1
#include<iostream>
#include<algorithm>
using namespace std;
int a[1007][1007];
int dp[1007][1007];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
dp[n][m]= a[n][m]>0 ? 1:1-a[n][m];
//跟新最后一行
for(int j=m-1;j>0;j--)
dp[n][j]= max(dp[n][j+1]-a[n][j],1);
//跟新最后一列
for(int i=n-1;i>0;i--)
dp[i][m]=max( dp[i+1][m]-a[i][m],1 );
for(int i=n-1;i>0;i--)
{
for(int j=m-1;j>0;j--)
{
dp[i][j]= max( min( dp[i][j+1],dp[i+1][j] )-a[i][j] , 1 );//在当前位置的下方和右方选一个最小值,再与1比较
}
}
cout<<dp[1][1]<<endl;
return 0;
}
滚动数组,空间优化到O( min(n,m) )。
#include<iostream>
#include<algorithm>
using namespace std;
int a[1007][1007];
int dp[1007];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
dp[m]= a[n][m]>0 ? 1:1-a[n][m];
//跟新最后一行
for(int j=m-1;j>0;j--)
dp[j]= max(dp[j+1]-a[n][j],1);
for(int i=n-1;i>0;i--)
{
for(int j=m;j>0;j--)
{
if(j==m)
dp[j]= max( dp[j]-a[i][j],1 );
else
dp[j]= max( min( dp[j],dp[j+1] )-a[i][j] , 1 );//在当前位置的下方和右方选一个最小值,再与1比较
}
}
cout<<dp[1]<<endl;
return 0;
}