POJ 1050 To the Max (简单的线性dp)

来源:互联网 发布:淘宝怎么冲销量 编辑:程序博客网 时间:2024/05/21 09:36

OJ题目:click here~~

题目分析:求子数组之和的最大值,这里是二维的,转化为一维解决。详见《编程之美》P191.

AC_CODE

const int Max_N = 102;const int inf = 1<<30;int PS[Max_N][Max_N];int BC(int a , int c , int m){    return PS[c][m] - PS[a][m] - PS[c][m - 1] + PS[a][m - 1];}int main(){    int n;    while(~scanf("%d",&n))    {        int i , j , k , num[Max_N][Max_N] , maxinum = -inf;        for(i = 1;i <= n;i++)            for(j = 1;j <= n;j++)            scanf("%d",&num[i][j]);        for(i = 0;i <= n;i++)            PS[i][0] = 0,PS[0][i] = 0;        for(i = 1;i <= n;i++)            for(j = 1;j <= n;j++)            PS[i][j] = PS[i - 1][j] + PS[i][j - 1] - PS[i - 1][j - 1] + num[i][j];        for(i = 1;i <= n;i++)        for(j = i;j <= n;j++){            int start = BC(i , j , n);            int all = BC(i , j , n);            for(k = n - 1;k >= 1;k--){                if(start < 0)                    start = 0;                start += BC(i , j , k);                if(start > all)                    all = start;            }            if(all > maxinum)                maxinum = all;        }        cout << maxinum << endl;    }    return 0;}


0 0
原创粉丝点击