uva 116 Unidirectional TSP

题意:给一个n*m的矩阵,表示到达每一个方格的代价,第i列上的元素可以走到i+1列的与它最近的三个格子。问从第1列到第m列,最小的代价是多少并输出所走路径的行编号。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
    int x,y,num;
}ele[1005];
int dp[1005];
bool cmp(const node &e1,const node &e2)
{
    return e1.x!=e2.x?e1.x<e2.x:e1.y>e2.y;
}
int main()
{
    int n=0,ans=0,pos;
    while(scanf("%d%d",&ele[n].x,&ele[n].y)!=EOF)
    {
        ele[n].num=n;
        n++;
    }
    sort(ele,ele+n,cmp);
    for(int i=n-2;i>=0;i--)
    {
        for(int j=i+1;j<n;j++)
        {
            if(ele[i].y>ele[j].y&&ele[i].x<ele[j].x)
            {
                dp[i]=max(dp[i],dp[j]+1);
                if(dp[i]>ans)
                {
                    ans=dp[i]; pos=i;
                }
            }
        }
    }
    printf("%d\n%d\n",ans+1,ele[pos].num+1);
    bool flag=true;
    while(1)
    {
        int temp;
        flag=false;
        for(int i=0;i<n;i++)
        {
            if(dp[i]==dp[pos]-1&&ele[i].y<ele[pos].y)
            {
                temp=i;
                flag=true;
            }
        }
        if(flag)
        {
            pos=temp;
            printf("%d\n",ele[pos].num+1);
        }
        else break;
    }
}


你可能感兴趣的:(ini)