Pku acm 1050 To the Max 动态规划题目解题报告(十六)

来源:互联网 发布:文华财经软件 编辑:程序博客网 时间:2024/05/20 19:19

http://acm.pku.edu.cn/JudgeOnline/problem?id=1050

题目的意思很简单,在一个矩阵里面找它的子矩阵,使得子矩阵数值之和到达最大。其实就是最大子段和问题在二维空间上的推广。先说一下一维的情况吧:设有数组a0,a1…an,找除其中连续的子段,使它们的和达到最大。假如对于子段:9 2 -16 2  temp[i]表示以ai结尾的子段中的最大子段和。在已知temp[i]的情况下,求temp [i+1]的方法是:

如果temp[i]>0 temp [i+1]= temp[i]+ai(继续在前一个子段上加上ai),否则temp[i+1]=ai(不加上前面的子段),也就是说 状态转移方程:

temp[i] = (temp[i-1]>0?temp[i-1]:0)+buf[i];

对于刚才的例子 temp 9 11 -5 2,然后取temp[]中最大的就是一维序列的最大子段。求一维最大子段和的函数:

int getMax(int buf[100],int n)

{

    int temp[101],max=n*(-127);

    memset(temp,0,4*(n+1));

   

    for(int i=1;i<=n;i++)

    {

        temp[i] = (temp[i-1]>0?temp[i-1]:0)+buf[i];

        if(max<temp[i])

            max=temp[i];

    }

    return max;

}

下面扩展到二维的情况:考察下面题目中的例子:

0         -2  -7  0

9           2  -6  2

-4  1  -4   7

-1  8  0   -2

我们分别用i j表示起始行和终止行,遍历所有的可能:

for(i=1;i<=n;i++)

    for(j=i;j<=n;j++) {}

我们考察其中一种情况 i=2 j=4,这样就相当与选中了2 3 4三行,求那几列的组合能获得最大值,由于总是 2 3 4行,所以我们可以将这3捆绑起来,变为求 4(9-4-1),11(8+2+1),-10(-6-4+0),7(7+2-2)的最大子段和,ok,问题成功转化为一维的情况!

带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得 
原创粉丝点击