usaco 3.3 Home on the Range

来源:互联网 发布:腾讯汽车招聘php 编辑:程序博客网 时间:2024/05/18 01:44

题目连接:http://ace.delos.com/usacoprob2?a=pBa6fEYMjoI&S=range

题目大意:给一个n*n的矩阵,只包含01,统计边长为k的正方形,且正方形内所有元素都为1 的个数。并按边长递增顺序输出。

思路:简单dp。状态方程:f[i][j]=min(min(f[i-1][j-1],f[i-1][j]),f[i][j-1])+1; f[i][j],表示右下角坐标为i,j的最大正方形的边长。

代码:

/*ID: czq1992LANG: C++TASK: range*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;int map[255][255],ans[255],f[255][255];int n;int main(){    int i,j,k;    char c;    freopen("range.in","r",stdin);    freopen("range.out","w",stdout);    cin>>n;    getchar();    for(i=1; i<=n; i++)    {        for(j=1; j<=n; j++)        {            //cin>>c;            c=getchar();            map[i][j]=c-'0';        }        getchar();    }    for(i=1; i<=n; i++)        for(j=1; j<=n; j++)        {            if(map[i][j])            {                f[i][j]=min(min(f[i-1][j-1],f[i-1][j]),f[i][j-1])+1;            }        }    for(i=1; i<=n; i++)        for(j=1; j<=n; j++)            if(f[i][j])            {                for(k=2;k<=f[i][j];k++) ans[k]++;            }    for(i=2; i<=250; i++)        if(ans[i]) cout<<i<<" "<<ans[i]<<endl;    return 0;}/*Compiling...Compile: OKExecuting...   Test 1: TEST OK [0.000 secs, 3740 KB]   Test 2: TEST OK [0.000 secs, 3740 KB]   Test 3: TEST OK [0.000 secs, 3740 KB]   Test 4: TEST OK [0.000 secs, 3740 KB]   Test 5: TEST OK [0.000 secs, 3740 KB]   Test 6: TEST OK [0.011 secs, 3740 KB]   Test 7: TEST OK [0.011 secs, 3740 KB]All tests OK.*/


原创粉丝点击