题目中map[i][j]可以穿越的意思就是map[i][j]到map[i+1][j+1]是一条可以从对角线穿越的特殊路径。
可知本题的最短路径就是穿过符合"条件"的尽可能多的特殊路径。该步骤可转化为求最长递增子序列。
而"条件"就是下一条可以穿过的特殊路径的i,j必须都大于上一条穿过的特殊路径的i,j(不能等于)。故要先进行排序。
然后用如果不穿过特殊路径的总路径(m+n)减去经过特殊路径减少的路程(2-sqrt(2))*maxx。最后乘上100。
#include <bits/stdc++.h>
#define maxn 1000005
using namespace std;
int dp[maxn],maxx;
struct node{
int x,y;
}l[maxn];
bool cmp(node a,node b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int f(int k){
maxx=-maxn;
for(int i=1;i<=k;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(l[i].x>l[j].x&&l[i].y>l[j].y&&dp[j]+1>dp[i]){
dp[i]=dp[j]+1;
maxx=max(maxx,dp[i]);
}
}
}
return maxx;
}
int main(){
int n,m;
double s=sqrt(2);
while(cin>>n>>m){
int k;
cin>>k;
for(int i=1;i<=k;i++)
cin>>l[i].x>>l[i].y;
sort(l,l+k+1,cmp);
int ans=(n+m-(2-s)*f(k))*100+0.5;//四舍五入
cout<<ans<<endl;
}
}
本文介绍了一种结合最短路径问题与最长递增子序列算法的解决方案,通过将特定条件下的穿越路径转化为最长递增子序列问题,从而求解最短路径。文章详细解释了算法步骤,包括特殊路径的定义、排序过程以及如何计算最终答案。
515

被折叠的 条评论
为什么被折叠?



