CSU 1205: Rectangles II

题目链接:http://122.207.68.93/OnlineJudge/problem.php?id=1205

最后没时间写了...也没去测试,O(n^4)次方的方法应该过不去吧,优化为O(n^3)的方法:

枚举上下边界,然后再枚举左边界,注意,右边界不需要枚举,左边界前进的时候,只需用上一次的位置继续往右试探,这样复杂度就是0(n^3)了。

CSU 1205
#include<stdio.h>
#include<string.h>
int sum[110];
int map[110][110];
int main()
{
    int T,n,m,s,i,j,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&s);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&map[i][j]);
            }
        }
        int cnt=0;
        for(i=1;i<=n;i++)
        {
            memset(sum,0,sizeof(sum));
            for(j=i;j<=n;j++)
            {
                for(k=1;k<=m;k++)
                {
                    sum[k]+=map[j][k];
                }
                int pos=1,buf=0;
                for(k=1;k<=m;k++)
                {
                    while(pos<=m&&(buf+sum[pos])<=s)
                    {
                        buf+=sum[pos++];
                    }
                    cnt+=pos-k;
                    buf-=sum[k];
                }
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

 

 

posted @ 2013-04-05 22:28  破晓べ  阅读(139)  评论(0编辑  收藏  举报