HDU 2859 Phalanx (dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859

给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线)

dp[i][j]表示i行j列元素的最大对称度

每到一个元素的时候,往上边和右边扩展看字符最优的对称长度 与dp[i - 1][j - 1]进行比较取最优即可。

 1 //#pragma comment(linker, "/STACK:102400000, 102400000")
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <ctime>
10 #include <list>
11 #include <set>
12 #include <map>
13 using namespace std;
14 typedef long long LL;
15 typedef pair <int, int> P;
16 const int N = 1e3 + 5;
17 int dp[N][N];
18 char str[N][N];
19 
20 int main()
21 {
22     int n;
23     while(~scanf("%d", &n) && n) {
24         for(int i = 1; i <= n; ++i) {
25             scanf("%s", str[i] + 1);
26         }
27         memset(dp, 0, sizeof(dp));
28         int res = 1;
29         for(int i = 1; i <= n; ++i) {
30             for(int j = n; j >= 1; --j) {
31                 int len = 1;
32                 while(str[i - len][j] == str[i][j + len] && i - len > 0 && j + len <= n) {
33                     ++len;
34                 }
35                 dp[i][j] = max(1, min(dp[i - 1][j + 1], len - 1) + 1);
36                 res = max(res, dp[i][j]);
37             }
38         }
39         printf("%d\n", res);
40     }
41     return 0;
42 }

 

posted @ 2016-08-17 21:20  Recoder  阅读(224)  评论(0编辑  收藏  举报