HDU2859(KB12-Q DP)

Phalanx

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1542    Accepted Submission(s): 757


Problem Description

Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th anniversary of the PRC.
A phalanx is a matrix of size n*n, each element is a character (a~z or A~Z), standing for the military branch of the servicemen on that position.
For some special requirement it has to find out the size of the max symmetrical sub-array. And with no doubt, the Central Military Committee gave this task to ALPCs.
A symmetrical matrix is such a matrix that it is symmetrical by the “left-down to right-up” line. The element on the corresponding place should be the same. For example, here is a 3*3 symmetrical matrix:
cbx
cpb
zcc
 

Input

There are several test cases in the input file. Each case starts with an integer n (0<n<=1000), followed by n lines which has n character. There won’t be any blank spaces between characters or the end of line. The input file is ended with a 0.
 

Output

Each test case output one line, the size of the maximum symmetrical sub- matrix.
 

Sample Input

3
abx
cyb
zca
4
zaba
cbab
abbc
cacq
0
 

Sample Output

3
3
 

Source

 
题意:找给出的方阵中,以左下到右上方向为对称轴的最大对称子方阵。
题解:dp[i][j]表示以ch[i][j]格子为左下角的最大对称子方阵。dp[i][j] = min(dp[i-1][j+1]+1, 从(i,j)点向上、右方向匹配的对称数)
 1 //2017-04-20
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 const int N = 1010;
10 char ch[N][N];
11 int dp[N][N];
12 
13 int main()
14 {
15     int n;
16     while(scanf("%d", &n)!=EOF && n)
17     {
18         for(int i = 0; i < n; i++)
19             scanf("%s", ch[i]);
20         int ans = 1;
21         for(int i = 0; i < n; i++)
22         {
23             for(int j = n-1; j >= 0; j--)
24             {
25                 if(i == 0 || j == n-1)
26                 {
27                     dp[i][j] = 1;
28                     continue;
29                 }
30                 int u, r, cnt = 1;
31                 for(int k = 1; k <= dp[i-1][j+1]; k++){
32                     u = i-k;
33                     r = j+k;
34                     if(ch[u][j] == ch[i][r])cnt++;
35                     else break;
36                 }
37                 dp[i][j] = min(dp[i-1][j+1]+1, cnt);
38                 if(ans < dp[i][j])ans = dp[i][j];
39             }
40         }
41         printf("%d
", ans);
42     }
43 
44     return 0;
45 }
原文地址:https://www.cnblogs.com/Penn000/p/6741187.html