正经题解|神庙大冒险
2024-07-08 14:11:55
发布于:浙江
67阅读
0回复
0点赞
题意分析
在一个范围为的矩阵当中去求解如何从前往终点。 在这个矩阵当中会存在多种情况,一开始价值为。
- 前往的坐标系所指向的类别为
.
,价值-1。 - 前往的坐标系所指向的类别为
M
,价值-k - 前往的坐标系所指向的类别为
D
,价值+z
针对于起点的类别不同采取
- 出现D的话进行+z的操作
方向只有右下
算法解析
根据前往的方向可以快速的求得状态和最基本的转移方程
设定为到达坐标的最大价值。
到达点只能由上和左来到,也就是
然后,根据地图上的三种情况,MD
来对于dp进行累加或者减少。
我们设定为初始状态,价值一开始为T,但是一旦 ,总价值需要加上z进行。
针对于状态转移方程书写代码即可。
时间复杂度分析
最坏需要遍历整个矩阵,所以时间复杂度为
STD标程
#include<bits/stdc++.h>
using namespace std;
bool vis[105][105];
long long answer ;
char mp[105][105];
long long dp[105][105];
long long n,t,k,z,sx,sy;
int main()
{
int n;
cin >> n >> t >> k >> z >> sx >> sy;
for(int i = 1 ; i <= n ; i ++ ){
for(int j = 1 ; j <= n ; j ++ ){
cin >> mp[i][j];
}
}
dp[sx][sy] = t;
if(mp[sx][sy] == 'D')dp[sx][sy] += z;
for(int i = sx+1 ; i <= n ; i ++ ){
dp[i][sy] = dp[i-1][sy];
if(mp[i][sy] == 'D')dp[i][sy] += z;
if(mp[i][sy] == '.')dp[i][sy] -= 1;
if(mp[i][sy] == 'M')dp[i][sy] -= k;
}
for(int i = sy + 1 ; i <= n ; i ++ )
{
dp[sx][i] = dp[sx][i-1];
if(mp[sx][i] == 'D')dp[sx][i] += z;
if(mp[sx][i] == '.')dp[sx][i] -= 1;
if(mp[sx][i] == 'M')dp[sx][i] -= k;
}
for(int i = sx + 1 ; i <= n ; i ++ )
{
for(int j = sy + 1 ; j <= n ; j ++ )
{
if(mp[i][j] == 'D')dp[i][j] += z;
if(i==sx&&j==sy)continue;
dp[i][j] += max(dp[i-1][j],dp[i][j-1]);
if(mp[i][j] == '.')dp[i][j] -= 1;
if(mp[i][j] == 'M')dp[i][j] -= k;
}
}
cout <<dp[n][n] << endl;
return 0;
}
全部评论 1
std语言没标注,高光没了。
2024-07-12 来自 西班牙
0
有帮助,赞一个