想不到可以转化为最长递增子序列。。。
因为每走一步都是往上走,所以求出一段最长的斜路即使最短路径。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 1000005
#define inf -999999
struct node
{
int x,y;
} s[N];
int dp[N],n,m;
int cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
else
return a.x<b.x;
}
int main()
{
while(cin>>n>>m)
{
int k;
cin>>k;
for(int i=1;i<=k;i++)
{
cin>>s[i].x>>s[i].y;
dp[i]=1;
}
int ma=0;
sort(s+1,s+1+k,cmp);
for(int i=2;i<=k;i++)
{
for(int j=1;j<i;j++)
{
if(s[i].x>s[j].x&&s[i].y>s[j].y)
dp[i]=max(dp[j]+1,dp[i]);
}
ma=max(ma,dp[i]);
}
double sum=(n+m-ma*2)*100+ma*100*sqrt(2.0);
printf("%.0f\n",sum);
}
return 0;
}