uva 116 Unidirectional TSP

来源:互联网 发布:海典软件怎么样 编辑:程序博客网 时间:2024/04/27 22:14

题意:给一个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;    }}