猛兽侠中精灵鼠在利剑飞船的追逐下逃到一个n*n的建筑群中,精灵鼠从(0,0)的位置进入建筑群,建筑群的出口位置为(n-1,n-1),建筑群的每个位置都有阻碍,每个位置上都会相当于给了精灵鼠一个固定值减速,因为精灵鼠正在逃命所以不能回头只能向前或者向下逃跑,现在问精灵鼠最少在减速多少的情况下逃出迷宫?
输入描述:
第一行迷宫的大小: n >=2 & n <= 10000; 第2到n+1行,每行输入为以','分割的该位置的减速,减速f >=1 & f < 10。
输出描述:
精灵鼠从入口到出口的最少减少速度?
输入例子1:
3 5,5,7 6,7,8 2,2,4
输出例子1:
19
分析:求最小的减速度之和。我们手算之后不难发现,其实到达的每个点的总最小减速度 = min(上面前一个点的总最小减速度, 左边前一个点的最小减速度)+当前点的减速度
也就是Time[i][j] = min( Time[i][j-1], Time[i-1][j] ) +mp[i][j];
为了节省空间, 将Time[][]变成一维数组,重复覆盖最小值,代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
vector<int>mp[10005];///地图
int Time[10005]={0};///时间
int main()
{
char str[10005];///输入
int n;
cin>>n;
int t;
char ch;
for(int i = 0; i<n;i++)
for(int j = 0; j < n; j++)
{
if(j!=0)cin>>ch;
cin>>t;
mp[i].push_back(t);
}
Time[0] = mp[0][0];///Time数组初始化
for(int i = 1; i < n; i++)
{
Time[i] = mp[0][i] +Time[i-1];
}
for(int i = 1; i < n; i++)///最小值计算
{
Time[0] = Time[0] + mp[i][0];
for(int j = 1; j < n; j++)
{
Time[j] = min((Time[j-1]+mp[i][j]),(Time[j]+mp[i][j]));
}
}
cout<<Time[n-1]<<endl;
return 0;
}