nyoj 飞翔d

来源:互联网 发布:软件开发招标 编辑:程序博客网 时间:2024/05/17 06:11

想不到可以转化为最长递增子序列。。。

因为每走一步都是往上走,所以求出一段最长的斜路即使最短路径。

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;#define N 1000005#define inf -999999struct 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;}


0 0
原创粉丝点击