uva 116 Unidirectional TSP

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


using namespace std;
#define INF 0x1f1f1f1f
#define LL long long


LL dp[15][333];
LL matrix[15][333];
int path[15][333];
#define min(a,b) (a) > (b)? (b):(a)
int row, clo;
int main()
{


    while(scanf("%d %d",&row, &clo) != EOF)
    {
        for( int i = 0; i < row; i++)
            for( int j = clo-1; j>=0; j--)
                scanf("%lld",&matrix[i][j]);


        memset(dp, 0, sizeof(dp));


        for( int i = 0; i < row; i++)
            dp[i][0] = matrix[i][0];


        for( int j = 1; j <= clo; j++)
        {
            for( int i = 0; i <= row; i++)
            {
                dp[i][j] = INF;


                int x1 = ( i - 1 + row)%row;
                int x2 = (x1 + 1)%row;
                int x3 = (x2 + 1)%row;


                if(x1 > x2)
                    swap(x1, x2);
                if(x1 > x3)
                    swap(x1, x3);
                if(x2 > x3)
                    swap(x2, x3);


                int tmp = x1;
                path[i][j] = x1;
                if(dp[x1][j-1] > dp[x2][j-1])
                    {
                        path[i][j] = x2;
                        tmp = x2;
                    }
                if(dp[tmp][j-1] > dp[x3][j-1])
                {
                    path[i][j] = x3;
                    tmp = x3;
                }


                dp[i][j] = dp[tmp][j-1] + matrix[i][j];
            }
        }


        LL minn = INF;
        int x;


        for( int i = 0; i < row; i++)
        {
            if(minn > dp[i][clo-1])
            {
                minn = dp[i][clo-1];
                x = i;
            }
        }
        printf("%d",x+1);
        for( int i = clo - 1; i > 0 ; i--)
        {
            printf(" %d",path[x][i]+1);
            x = path[x][i];
        }
        printf("\n");
        printf("%d\n",minn);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值