uva 116 动态规划-单向TSP(输出结果字典序)

来源:互联网 发布:爬虫部署到阿里云 编辑:程序博客网 时间:2024/05/17 07:40

1、

2、题目大意:

给定一个m × n的整数矩阵,你要写一个程序来计算出最小权值。一条路径从列1(第一列)的任意位置开始,包括一系列的移动,最终抵达列n(最后一列)。每一步均由列i到列i+1的相邻行(水平或对角)。 矩阵的第一行和最后一行(行1和m)认为是相邻的,也就是说矩阵是环绕的,就像一个水平的圆柱体。合法的移动图示如下。

fig1

The weight of a path is the sum of the integers in each of the n cells of the matrix that are visited.
路径的权重就是矩阵中遍例到的所有n个单元的整数值之和。

For example, two slightly different 5 × 6 matrices are shown below (the only difference is the numbers in the bottom row).
比如,两个稍有不同的5 × 6的矩阵图示如下(仅仅在最下一行的数字中有一处不同)。

fig2

The minimal path is illustrated for each matrix. Note that the path for the matrix on the right takes advantage of the adjacency property of the first and last rows.
两个矩阵的最短路径如图所示。注意右边矩阵的最短路径利用了最上一行和最下一行的特殊相邻性质。

3、状态很容易得到,可以到达三个状态,右上,右边,右下

4、AC代码:不知道为什么必须倒着进行,

#include<stdio.h>#include<algorithm>using namespace std;#define N 0x7fffffffint dp[100][10];int prev[100][10];int n,m;int map[100][10];void DP(){   for(int j=m-2;j>=0;j--)   {       for(int i=0;i<n;i++)       {           int minx=(i-1+n)%n;           if(map[j+1][minx]>map[j+1][i])           {               minx=i;           }           else if(map[j+1][minx]==map[j+1][i])           minx=min(minx,i);           if(map[j+1][minx]>map[j+1][(i+1+n)%n])           minx=(i+1+n)%n;           else if(map[j+1][minx]==map[j+1][(i+1+n)%n])           minx=min(minx,(i+1+n)%n);           map[j][i]+=map[j+1][minx];           prev[j][i]=minx;       }   }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            scanf("%d",&map[j][i]);        }        DP();        int minn=N,mx;        for(int i=0;i<n;i++)        {            if(map[0][i]<minn)            {                minn=map[0][i];                mx=i;            }        }        printf("%d",mx+1);        int mxx=mx;        for(int j=1;j<m;j++)        {            int i=mx;            printf(" %d",prev[j-1][i]+1);            mx=prev[j-1][i];        }        printf("\n");        printf("%d\n",map[0][mxx]);    }    return 0;}


 

4.代码不正确,待改正:

#include<stdio.h>#include<algorithm>using namespace std;#define N 0x7fffffffint dp[10][100];int prev[10][100];int n,m;int map[10][100];void DP(){   for(int j=m-2;j>=0;j--)   {       for(int i=0;i<n;i++)       {           int minx=(i-1+n)%n;           if(map[minx][j+1]>map[i][j+1])           {               minx=i;           }           else if(map[minx][j+1]==map[i][j+1])           minx=min(minx,i);           if(map[minx][j+1]>map[(i+1+n)%n][j+1])           minx=(i+1+n)%n;           else if(map[minx][j+1]==map[(i+1+n)%n][j+1])           minx=min(minx,(i+1+n)%n);           map[i][j]+=map[minx][j+1];           prev[i][j]=minx;       }   }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            scanf("%d",&map[i][j]);        }        DP();        int minn=N,mx;        for(int i=0;i<n;i++)        {            if(map[i][0]<minn)            {                minn=map[i][0];                mx=i;            }        }        printf("%d",mx+1);        for(int j=1;j<m;j++)        {            int i=mx;            printf(" %d",prev[i][j-1]+1);            mx=prev[i][j-1];        }        printf("\n");        printf("%d\n",map[mx][0]);    }    return 0;}