个人小结:
代码虽长,但核心思想不难,基础的动态规划问题。提交后6个样例里通过了5个,觉得算法应该没问题的。找了一上午都没发现问题原因。最后还是将所有数据全部打印出来,才发现在for循环这里出了大问题。
是在处理右下块的时候误将for(int i=x+1;i<=n;i++)写成了for(int i=x+1;i>=1;i–),不仅右下角的数据没算出来,还把右上正确的数据给部分覆盖了。
有时候通过了几个样例,并不代表仅存在小毛病,能通过的几个样例可能是巧合罢了。
一道简单的题目花了很久的时间才解决,开始怎么看都看不出问题,实在是挺折磨人的。
总之,找Bug不易,写代码切记要细心啊!!
(print版)
#include<bits/stdc++.h>
using namespace std;
int Map[1001][1001];
const int neg=0;
long long int dp[1001][1001];
int main(){
int n,m,x,y,v,c;
memset(dp,0,sizeof(dp));
memset(Map,0,sizeof(Map));
cin>>n>>m>>x>>y>>v>>c;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>Map[i][j];
}
}
dp[x][y]=v;
for(int i=x;i>=1;i--){ //左上
for(int j=y;j>=1;j--){
if(i==x){
if(j==y){
continue;
}
else{
if(dp[i][j+1]<=0){
dp[i][j] = neg;
}
else{
dp[i][j] = dp[i][j+1]+ Map[i][j];
}
}
}
else if(j==y){
if(dp[i+1][j]<=0){
dp[i][j]= neg;
}
else{
dp[i][j]=dp[i+1][j]+Map[i][j];
}
}
else{
if(dp[i+1][j]<=0&&dp[i][j+1]<=0){
dp[i][j]= neg;
}
else{
dp[i][j]=max(dp[i+1][j],dp[i][j+1])+Map[i][j];
}
}
if(dp[i][j]>=c){
dp[i][j]=c;
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<'\n';
// }
// cout<<'\n';
}
}
for(int i=x;i>=1;i--){ //右上
for(int j=y+1;j<=m;j++){
if(i==x){
if(dp[i][j-1]<=0){
dp[i][j]= neg;
}
else{
dp[i][j] = dp[i][j-1]+ Map[i][j];
}
}
else{
if(dp[i+1][j]<=0&&dp[i][j-1]<=0){
dp[i][j]= neg;
}
else{
dp[i][j]=max(dp[i+1][j],dp[i][j-1])+Map[i][j];
}
}
if(dp[i][j]>=c){
dp[i][j]=c;
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<'\n';
// }
// cout<<'\n';
}
}
for(int i=x+1;i<=n;i++){ //左下
for(int j=y;j>=1;j--){
if(j==y){
if(dp[i-1][j]<=0){
dp[i][j]= neg;
}
else{
dp[i][j]=dp[i-1][j]+Map[i][j];
}
}
else{
if(dp[i-1][j]<=0&&dp[i][j+1]<=0){
dp[i][j]= neg;
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j+1])+Map[i][j];
}
}
if(dp[i][j]>=c){
dp[i][j]=c;
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<'\n';
// }
// cout<<'\n';
}
}
for(int i=x+1;i<=m;i++){ //右下
for(int j=y+1;j<=m;j++){
if(dp[i-1][j]<=0&&dp[i][j-1]<=0){
dp[i][j]= neg;
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+Map[i][j];
}
if(dp[i][j]>=c){
dp[i][j]=c;
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<'\n';
// }
// cout<<'\n';
}
}
int a=max(dp[1][1],dp[1][m]);
int b=max(dp[n][1],dp[n][m]);
a=max(a,b);
if(a<=0){
cout<<"-1"<<'\n';
}
else{
cout<<a<<'\n';
}
return 0;
}