Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243164
  • 博文数量: 59
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-30 20:21
文章分类

全部博文(59)

文章存档

2011年(1)

2009年(58)

我的朋友

分类: C/C++

2009-05-04 19:18:00


/*
 * Filename: matrix_chain.c
 *
 * Function: 矩阵连乘问题,其断开点的不同,计算次数会不同,找出使计算量最少的断开点。
 *
 * Note:     用动态规化算法实现
 *
 * Version: 1.0
 *
 * Author: WUSW
 * Date:   2009.4.24
 */

#include

#define COL 6

void matrix_chain( const int *p, size_t len, int m[][COL], size_t s[][COL] )
{
  size_t i = 0;
  size_t j = 0;
 
  for (i=0; i    {
      for (j=0; j    {
      m[i][j] = 0;
      s[i][j] = 0;
    }
    }

  size_t span = 0;
  size_t bp = 0;
  int sub_chn = 0;
 
  for (span=2; span<=COL; span++)
    {
      for (i=0; i<=len-span; i++)
    {
      j = i + span -1;

      m[i][j] = m[i+1][j] + p[i]*p[i+1]*p[j+1];
      s[i][j] = i;
     
      for (bp=i+1; bp        {
          sub_chn = m[i][bp] + m[bp+1][j] + p[i]*p[bp+1]*p[j+1];

          if (sub_chn < m[i][j])
        {
          m[i][j] = sub_chn;
          s[i][j] = bp;
        }
         
        }
    }
    }
 
}


int main(int argc, char * argv[])
{
  int p[] = {30, 35, 15, 5, 10, 20, 25} ;
  int m[COL][COL];
  size_t s[COL][COL];
 
  matrix_chain( p, COL, m, s );

  int i,j;
  for (i=0; i    {
      for (j=0; j    {
      printf( "%d ", m[i][j] );
    }
      printf( "\n" );
    }
 
  return 0;
 
}


/*
 * Filename: mem_matrix.c
 *
 * Function: 矩阵连乘问题,其断开点的不同,计算次数会不同,找出使计算量最少的断开点。
 *
 * Note:     用备忘录方法实现
 *
 * Version: 1.0
 *
 * Author: WUSW
 * Date:   2009.4.24
 */
#include

#define COL 6
size_t mem_matrix( const int *p, const int len, size_t i, size_t j,
             int m[][COL], size_t s[][COL] )
{
  if (i == j)
    {
      return 0;
    }
  if (m[i][j] > 0)
    {
      return m[i][j];
    }
 
  m[i][j] = mem_matrix( p, len, i+1, j, m, s ) + p[i]*p[i+1]*p[j+1];
  s[i][j] = i;
 
  size_t bp = 0; // best position
  int tmp_chain = 0;
   
  for (bp=i+1; bp    {
      tmp_chain = mem_matrix( p, len, i, bp, m, s ) +
    mem_matrix( p, len, bp+1, j, m, s ) + p[i]*p[bp+1]*p[j+1];
      if (tmp_chain < m[i][j])
    {
      m[i][j] = tmp_chain;
      s[i][j] = bp;
    }
    }
  return m[i][j];
 
}

int main(int argc, char * argv[])
{
  int p[] = {30, 35, 15, 5, 10, 20, 25} ;
  int m[COL][COL] = {{0}} ;
  size_t s[COL][COL] = {{0}};
 
  mem_matrix( p, COL, 0, 5, m, s );
 
  int i,j;
  for (i=0; i    {
      for (j=0; j    {
      printf( "%d ", m[i][j] );
    }
      printf( "\n" );
    }

  return 0;
 
}
阅读(1062) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~