算法举例:
有五个元素的有序集合A={a1,a2,a3,a4,a5},q0=0.05,q1=0.1,q2=q3=q4=0.05,q5=0.1,p1=0.15,p2=0.1,p3=0.05,p4=0.1,p5=0.2,为方便起见,p和q都乘以100;
#include<stdio.h>
#define max 6
void main()
{
int i,j,k,Big,w[max][max],c[max][max],r[max][max];
int q[max]={5,10,5,5,5,10},p[max]={0,15,10,5,10,20};
printf("二维数组为:\n");
//求主对角线即i=j时的w,c,r的二维数组。
for(i=0;i<6;i++)
{
j=i;
w[i][j]=q[i];
c[i][j]=r[i][j]=0;
}
//求除主对角线外的w的二维数组
for(i=0;i<6;i++)
for(j=i+1;j<6;j++)
w[i][j]=q[j]+p[j]+w[i][j-1];
//求除主对角线外的c与r的二维数组
for(i=4;i>=0;i--)
for(j=i+1;j<=5;j++)
{
Big=100000;
for(k=i+1;k<=j;k++)
if(c[i][k-1]+c[k][j]<Big)
{
Big=c[i][k-1]+c[k][j];
r[i][j]=k;
}
c[i][j]=Big+w[i][j];
}
//输出结果
for(i=0;i<6;i++)
{
for(j=i;j<6;j++)
printf("(%d,%d,%d)",w[i][j],c[i][j],r[i][j]);
printf("\n");
}
