您的位置:首页 > 其它

算法导论 思考题 15-8(基于接缝裁剪的图像压缩)

2017-06-01 18:38 225 查看
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define M 8
#define N 10

int A[M]
=
{
{1,2,3,4,5,6,7,8,9,10},
{2,3,4,5,6,7,8,9,10,11},
{8,4,6,2,7,2,7,8,12,15},
{10,23,5,7,9,10,13,9,18,20},
{4,8,1,9,23,6,8,11,17,30},
{9,5,1,7,5,7,5,19,6,8},
{10,45,7,2,8,2,6,8,2,13},
{10,5,30,29,5,8,6,2,5,20},
};

int B[M]
={0};
int C[M]
={0};

int minOf3(int a,int b,int c)
{
if(a<=b && a<=c)
return a;
else if(b<=c)
return b;
else
return c;
}

int getMin(int i,int j)
{
int a1,a2,a3;
if(j-1>=0)
a1=B[i-1][j-1];
else
a1=INT_MAX;
a2=B[i-1][j];
if(j+1<N)
a3=B[i-1][j+1];
else
a3=INT_MAX;
int min=minOf3(a1,a2,a3);
if(min==a1)
C[i][j]=-1;
else if(min==a2)
C[i][j]=0;
else
C[i][j]=1;
return min;
}

void dp()
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
B[i][j]=A[i][j];
}
}
for(int i=1;i<M;i++)
{
for(int j=0;j<N;j++)
{
B[i][j]+=getMin(i,j);
}
}
}

void printB()
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
printf("%d ",B[i][j]);
}
printf("\n");
}
}

void printA()
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
printf("%2d ",A[i][j]);
}
printf("\n");
}
}

void printTrace(int startCol)
{
printf("col%d:%d ",startCol+1,A[M-1][startCol]);
int j=startCol+C[M-1][startCol];
for(int i=M-2;i>=0;i--)
{
printf("col%d:%d ",j+1,A[i][j]);
j+=C[M-1][j];
}
printf("\n");
}

int getResult()
{
int min=INT_MAX,mini;
for(int i=0;i<N;i++)
{
if(B[M-1][i]<min)
{
min=B[M-1][i];
mini=i;
}

}
printf("min cost:%d\n",min);
return mini;
}

void main()
{
dp();
//printB();
printA();
int scol=getResult();
printTrace(scol);
getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: