第一行输入两个整数
代表迷宫的大小。
此后
行,每行输入
个整数
代表每个迷宫方格的金币数量。
第
行输入一个整数
代表信息条数。
此后
行,每行输入三个整数
代表一条信息。保证每一条信息的
互不相同。
输出一个整数,代表小K最多能收集到的金币数量。
3 3 1 100 100 1 100 100 1 1 1 3 1 1 1 1 2 1 2 2 2
5
在这个样例中,我们使用
表示墙方格,用
表示小K当前回合所在的位置。初始时,迷宫状态如公式所示:
。
第一回合:由于
会在第一回合变为墙方格,所以他只能走到
,第一回合结束时,小K已经得到了
个金币,迷宫状态如公式所示:
。
第二回合,小K只能向下移动到
,第二回合结束时,小K已经得到了
个金币,迷宫状态如公式所示:
。
剩余的回合,迷宫不再发生变化,而由于小K只能向下或者右移动,所以他至多收集到
和
两个方格的金币。加起来刚好是
个金币。
3 3 1 100 100 100 100 100 100 100 100 2 2 1 1 1 2 1
1
import sys
data = sys.stdin.buffer.read().split()
it = iter(data)
n = int(next(it))
m = int(next(it))
maze = [[0 for _ in range(m+1)]]
for _ in range(n):
temp = [0]
for _ in range(m):
temp.append(int(next(it)))
maze.append(temp)
t= int(next(it))
for _ in range(t):
x = int(next(it))
y = int(next(it))
z = int(next(it))
if (x-1) + (y-1) >= z:
maze[x][y] = 'wall'
inf = -float('inf')
dp = [[inf for _ in range(m+1)] for _ in range(n+1)]
for i in range(1,n+1):
for j in range(1,m+1):
if i == 1 and j == 1:
dp[i][j] = maze[i][j]
if maze[i][j] != 'wall':
max_num = max(dp[i-1][j], dp[i][j-1])
if max_num != inf:
dp[i][j] = max_num + maze[i][j]
print(max(max(x) for x in dp)) #include<bits/stdc++.h>
using namespace std;
const int N=1005;
const int INF=1e9+10;//这里要尽可能大,取小不能全部通过
int mp[N][N];//金币
int wall[N][N];//变成墙的时间
int dp[N][N];//到i,j所得到的最大金币
int main(){
int n,m,t;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{cin>>mp[i][j];//录入金币,同时初始化墙和dp
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
wall[i][j]=INF;//最大值表示一定能走到,因为没有墙
dp[i][j]=-INF;//最小值表示有墙走不到所以下面max也取不到
}
}
cin>>t;
for(int i=1;i<=t;i++){//输入墙的时间
int x,y,v;
cin>>x>>y>>v;
wall[x][y]=v;
}
int ans=-1;
dp[1][0]=dp[0][1]=0;//初始化边界
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if((i+j-2)<wall[i][j])dp[i][j]=max(dp[i-1][j],dp[i][j-1])+mp[i][j];//如果可以走到,就动规
ans=max(ans,dp[i][j]);//每次更新最大金币数
}
}
cout<<ans;//输出
}