USACO3.34Home on the Range(DP)

以前作過一道相似的 國際象棋盤神馬的。。 ios

統計出以每一個1做爲右下角的最大正方形 那麼以大於二到這個最大值之間爲邊的正方形均可以以這個爲右下角 累加就能夠了ide

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

 1 /*
 2     ID: shangca2
 3     LANG: C++
 4     TASK: range
 5  */
 6 #include <iostream>
 7 #include<cstdio>
 8 #include<cstring>
 9 #include<algorithm>
10 #include<stdlib.h>
11 using namespace std;
12 int dp[255][255],num[255];
13 char s[255][255];
14 int main()
15 {
16     freopen("range.in","r",stdin);
17     freopen("range.out","w",stdout);
18     int i,j,n;
19     cin>>n;
20     for(i = 1; i <= n ;i++)
21         for(j = 1; j <= n ; j++)
22         {
23             cin>>s[i][j];
24             if(s[i][j]=='1')
25             dp[i][j] =1;
26         }
27     for(i = 2; i <= n ; i++)
28     {
29         for(j = 2 ; j <= n ; j++)
30         {
31             if(s[i][j]=='1'&&s[i-1][j]=='1'&&s[i-1][j-1]=='1'&&s[i][j-1]=='1')
32             dp[i][j] = min(min(dp[i-1][j],dp[i-1][j-1]),dp[i][j-1])+1;
33         }
34     }
35     for(i = 2; i <= n ; i++)
36         for(j = 2; j <= n ;j++)
37         {
38             for(int g = 2 ; g <= dp[i][j] ; g++)
39             num[g]++;
40         }
41     for(i = 2; i <= n ; i++)
42     if(num[i])
43     cout<<i<<" "<<num[i]<<endl;
44     return 0;
45 }
View Code
相關文章
相關標籤/搜索