• UVA 116 Unidirectional TSP


    写的麻烦了,修改了好久,用递归写的思路不是很好,以后要优化一下,用递推再做一遍。

    代码是下:

    #include<stdio.h>
    #include<string.h>
    #define INF 0x7fffffff
    int a[15][110], py[110][110][110],ans[110][110];
    int m, n;
    int dp(int p, int q, int x)
    {
    if(ans[p][q] != 16843009) return ans[p][q];
    if(q == n) return a[p][q];
    else if(p>=1&&p<=m&&q>=1&&q<n)
    {
    int t = p + 1;
    int s = p - 1;
    if(t > m) t = 1;
    if(s < 1) s = m;
    // printf("p=%d q=%d ans = %d\n",p,q,ans);
    if(dp(s,q+1,x) > dp(p,q+1,x))
    {
    if(dp(p,q+1,x) > dp(t,q+1,x))
    {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else if(dp(p,q+1,x) < dp(t,q+1,x))
    {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
    else if(p > t)
    {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
    }
    else if(dp(s,q+1,x) < dp(p,q+1,x))
    {
    if(dp(s,q+1,x) > dp(t,q+1,x))
    {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else if(dp(s,q+1,x) < dp(t,q+1,x))
    {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
    else if(s > t)
    {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
    }
    else if(dp(p,q+1,x) > dp(t,q+1,x))
    {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else if(dp(p,q+1,x) < dp(t,q+1,x))
    {
    if(s > p) {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
    else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
    }
    else if(dp(p,q+1,x) == dp(t,q+1,x))
    {
    if(s>p)
    {
    if(p>t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
    }
    else if(s<p)
    {
    if(t<s) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
    }
    else if(s>t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
    else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
    }
    return ans[p][q];
    }
    }
    void print(int p ,int x, int y)
    {
    for(; y<=n; y++)
    {
    if(y == n) {printf("%d\n",x); break;}
    printf("%d ",x);
    x = py[p][x][y];
    }
    }
    void input()
    {
    while(scanf("%d%d",&m,&n) == 2)
    {
    for(int i = 1; i <= m; i ++)
    for(int j = 1; j <= n; j ++)
    scanf("%d",&a[i][j]);
    int v = INF;
    int flag;
    for(int i = 1; i <= m; i ++)
    {
    memset(ans,1,sizeof(ans));
    int z = dp(i,1,i);
    if(v > z) {v = z; flag = i;}
    // printf("v = %d flag=%d\n",v,flag);
    }
    print( flag, flag, 1);
    printf("%d\n", v);
    }
    }
    int main()
    {
    //freopen("da.out","w",stdout);
    input();
    return 0;
    }



  • 相关阅读:
    Java在控制台运行IDE工具编写的程序
    mysql数据库执行存储过程问题
    Java之正则表达式在字符串中查找中文
    java之endwith()方法以及正则表达式匹配中文
    工具资源 Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
    5、概率图模型 Inference-Variable_Elimination
    4、概率图模型:Template Modles
    3、概率图模型:Local Structure in Markov Network
    2、概率图模型: Markov Random Fields
    1、概率图模型: Bayesian Networks
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2392683.html
Copyright © 2020-2023  润新知