• 网志分类
  • » 查看所有日志 (45)
    » ACM (24)
    » 程序设计语言 (3)
    » 我的软件 (5)
    » 转贴 (12)
    » 被遗忘的角落 (1)
  • 站内搜索
  • 友情链接
  • » 我的歪酷 非非共享界
    » kuye
    » 开复学生网

    订阅 RSS

    歪酷博客

    0011507

    « 上一篇: 大学四年应是这样度过 李开复 下一篇: 又是一道DP »
    kodder @ 2006-05-13 01:05

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX   101
    int grid[MAX][MAX], f[MAX][MAX], tree[MAX][MAX], path[MAX];
    int m, n;
    int findmin(int i, int j)
    {
           // compare f[i][j + 1], f[i - 1][j + 1], f[i + 1][j + 1]
           if (f[i][j + 1] < f[i - 1][j + 1]) {
                  if (f[i][j + 1] < f[i + 1][j + 1])
                         return i;
                  if (f[i][j + 1] == f[i + 1][j + 1])
                         return i + 1 == m + 1 ? 1 : i;
                  return i + 1 == m + 1 ? 1 : i + 1;
           }
           if (f[i][j + 1] == f[i - 1][j + 1]) {
                  if (f[i + 1][j + 1] < f[i][j + 1])
                         return i + 1 == m + 1 ? 1 : i + 1;
                  if (f[i + 1][j + 1] == f[i][j + 1]) {
                         return (i + 1 == m + 1 ? 1 : i - 1 == 0 ? i : i - 1);
                  }
                  return i - 1 == 0 ? i : i - 1;
           }
           if (f[i][j + 1] > f[i - 1][j + 1]) {
                  if (f[i + 1][j + 1] < f[i - 1][j + 1])
                         return i + 1 == m + 1 ? 1 : i + 1;
                  if (f[i + 1][j + 1] == f[i - 1][j + 1]) {
                         return (i + 1 == m + 1 ? 1 : i - 1 == 0 ? i + 1 : i - 1);
                  }
                  return i - 1 == 0 ? m : i - 1;
           }
          
           return -1;
          
    }
    // sequecct from len - 1... 0
    int main(void)
    {
           int i, j, min;
          
           while (scanf("%d %d", &m, &n) == 2) {
                  for (i = 1; i <= m; i++) {
                         for (j = 0; j < n; j++)
                                scanf("%d", &grid[i][j]);
                  }
                  for (j = 0; j < n; j++) {
                         grid[m + 1][j] = grid[1][j];
                         grid[0][j] = grid[m][j];
                  }
                  for (i = 1; i <= m; i++) {
                         f[i][n - 1] = grid[i][n - 1];  
                         tree[i][n - 1] = i;
                  }
                  f[0][n - 1] = f[m][n - 1];
                  f[m + 1][n - 1] = f[1][n - 1];
                  tree[0][n - 1] = tree[m][n - 1];
                  tree[m + 1][n - 1] = tree[1][n - 1];
                  for (j = n - 2; j >= 0; j--) {
                         for (i = 1; i <= m; i++) {
                                min = findmin(i, j);
                                f[i][j] = f[min][j + 1] + grid[i][j];
                                tree[i][j] = min;
                         }
                         f[0][j] = f[m][j];
                         f[m + 1][j] = f[1][j];
                  }
                  min = 1;
                  for (i = 2; i <= m; i++) {
                         if (f[i][0] < f[min][0]) {
                                min = i;
                         }
                  } 
                  i = min;
                  for (j = 0; j < n - 1; j++) {
                         printf("%d ", min);
                         min = tree[min][j];
                  }
                  printf("%d\n%d\n", min, f[i][0]);
           }
           return 0;
    }




    评论 / 个人网页 / 扔小纸条
    * 昵称

    已经注册过? 请登录

    新用户请先注册 以便能显示头像及追踪评论回复

    Email
    网址
    * 评论
    表情
     


     

    分类小组论坛
    杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

    请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

    相关法律法规
    全国人大常委会关于维护互联网安全的决定
    中华人民共和国计算机信息系统安全保护条例
    中华人民共和国计算机信息网络国际联网管理暂行规定
    计算机信息网络国际联网安全保护管理办法
    计算机信息系统国际联网保密管理规定