题目链接: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; }