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 }
时间: 2024-12-16 21:08:19

HDU 2859 Phalanx (dp)的相关文章

[2016-03-29][HDU][2859][Phalanx]

时间:2016-03-29 15:53:01 星期二 题目编号:[2016-03-29][HDU][2859][Phalanx] 分析:dp[i][j]表示以 (i,j)为左下角 #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1000 + 10; char a[maxn][maxn]; int dp[maxn][maxn],ans,n; void func(int x,int

HDU - 2859 Phalanx

题意:求/直线的对称矩阵最大多大 思路:DP 每个点就是了 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 1200; int dp[MAXN][MAXN]; char str[MAXN][MAXN]; int n; int main() { while (scanf(&quo

HDU 2859 Phalanx(二维DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 题目大意:对称矩阵是这样的矩阵,它由“左下到右”线对称. 相应位置的元素应该相同. 例如,这里是3 * 3对称矩阵: cbx cpb zcc 给出任意的n*n的矩阵找出里面最大的对称的子矩阵,输出大小. 解题思路:有这样一个规律,对于每个字符看该列以上和该行右侧的字符匹配量,如果匹配量大于右上角记录下来的矩阵大小,就是右上角的数值+1,否则就是这个匹配量.根据这个规律,把n*n的点都遍历以便一

HDU 2859&mdash;Phalanx(DP)

Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u 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 e

hdu(2859)——Phalanx(dp)

题意: 现在有一个n*n的矩阵,然后每个格子中都有一个字母(大写或小写组成).然后询问你现在最大的对称子矩阵的边长是多少.注意这里的对角线是从左下角到右上角上去的. 思路: 这道题我自己写出了dp的定义式,但是要怎么转移方程并没有推出来. 我看了好久的题解才明白的,果然还是太弱... 首先我们定义:dp[i][j]为第i行第j列所能够组成的最大对称子矩阵的长度.关于对角线完全对称的矩阵! 转移方程为:dp[i][j]=dp[i-1][j+1]+1 : 注意这里是由点(i-1,j+1)推过来的.因

HDU - 2859 Phalanx(dp)

题目链接:点我点我 题意:求以左下到右上的最大对称矩阵. 题解:对于每个点(以它为一个矩阵的最左下角),判断一下它右边的第一个点和上面的第一个点,如果相同就再往下判断下去,直到不相同,取当前位置能拿到的值. 如果一直相同,说明这个最左下脚的点能够加入进去成为一员,+1呗. 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int N=1111; 6 char map[N][N]

Q - Phalanx HDU 2859 ( dp )

Q - Phalanx Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2859 Description Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th anniversary of the PRC. A pha

hdu 4734 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4734 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, plea

hdu 3853 概率DP 简单

http://acm.hdu.edu.cn/showproblem.php?pid=3853 题意:有R*C个格子,一个家伙要从(0,0)走到(R-1,C-1) 每次只有三次方向,分别是不动,向下,向右,告诉你这三个方向的概率,以及每走一步需要耗费两个能量,问你走到终点所需要耗费能量的数学期望: 回头再推次,思想跟以前的做过的类似 注意点:分母为0的处理 #include <cstdio> #include <cstring> #include <algorithm>