HDU 1081 To The Max(最大サブマトリクス和)

1190 ワード

标题链接:Click here~~
タイトル:
RT.
問題解決の考え方:
方法を考えて2次元を1次元問題に変換し,行列和の特徴を観察すると,選択した行列の各行各列を加算することが難しくないことが分かった.
そこで、選択可能なすべての最初の行と最後の行を列挙し、各列の要素を加えて配列a[]を格納することができる.
そして、配列a[]における連続する要素は連続する列に相当し、最初の行と最後の行も決定されるので、配列a[]における連続する要素の和は行列の和に相当する.
そして問題は配列a[]を求める最大連続サブシーケンス和に変換される.複雑度O(n^3).
#include <stdio.h>
#include <string.h>
#include <limits.h>
int main()
{
    int n,R,C,w[102][102],a[102];
    while(~scanf("%d",&n))
    {
        R = C = n;
        for(int i=1;i<=R;i++)
            for(int j=1;j<=C;j++)
                scanf("%d",&w[i][j]);
        int ans = INT_MIN;
        for(int i=1;i<=R;i++)
        {
            memset(a,0,sizeof(a));
            for(int j=i;j<=R;j++)
            {
                int sum = -1;
                for(int k=1;k<=C;k++)
                    a[k] += w[j][k];
                for(int k=1;k<=C;k++)
                {
                    sum = sum<0 ? a[k] : sum+a[k];
                    if(ans < sum)
                        ans = sum;
                }
            }
        }
        printf("%d
",ans); } }