您的位置:首页 > 其它

USACO3.34Home on the Range(DP)

2013-08-21 13:46 477 查看
之前做过一道类似的 国际象棋盘神马的。。

统计出以每个1作为右下角的最大正方形 那么以大于二到这个最大值之间为边的正方形都可以以这个为右下角 累加就可以了

dp[i][j] = min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1;

/*
ID: shangca2
LANG: C++
TASK: range
*/
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int dp[255][255],num[255];
char s[255][255];
int main()
{
freopen("range.in","r",stdin);
freopen("range.out","w",stdout);
int i,j,n;
cin>>n;
for(i = 1; i <= n ;i++)
for(j = 1; j <= n ; j++)
{
cin>>s[i][j];
if(s[i][j]=='1')
dp[i][j] =1;
}
for(i = 2; i <= n ; i++)
{
for(j = 2 ; j <= n ; j++)
{
if(s[i][j]=='1'&&s[i-1][j]=='1'&&s[i-1][j-1]=='1'&&s[i][j-1]=='1')
dp[i][j] = min(min(dp[i-1][j],dp[i-1][j-1]),dp[i][j-1])+1;
}
}
for(i = 2; i <= n ; i++)
for(j = 2; j <= n ;j++)
{
for(int g = 2 ; g <= dp[i][j] ; g++)
num[g]++;
}
for(i = 2; i <= n ; i++)
if(num[i])
cout<<i<<" "<<num[i]<<endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: