首页 > 代码库 > 动规-HDU-2859
动规-HDU-2859
http://acm.hdu.edu.cn/showproblem.php?pid=2859
Phalanx
给定一个n*m的字符矩阵,求最大以副对角线对称的子方阵行数。
解题报告
思路
对于给定字符矩阵M:
记以元素M[i][j]为左下角的最大副对角线对称子方阵行数为dp[i][j]。
假设已经求得dp[i-1][j+1],欲求dp[i][j],则需要以dp[i-1][j+1]为上界,判断从M[i][j]为左下角开始的M[i][k]与M[k][j]有多少个连续相同即可。
那么就可以两层循环遍历每个元素,对于每个元素按上述方法求得dp[i][j],取其中的最大值即为解。
(这种O(n^3)的做法能过也多亏给的时间限制够宽松...)
代码
#include <algorithm> #include <iostream> #include <string> using namespace std; const int maxn = 1003; string str[maxn]; int dp[maxn][maxn]; int n; int ans; int Check(int x, int y) { int tx = x, ty = y, len = dp[x-1][y+1]; int cnt = 0; for (int i = 0; i < len; i++) { tx--; ty++; if (tx < 0 || ty >= n) break; if (str[tx][y] != str[x][ty]) break; cnt++; } return cnt; } int main() { ios::sync_with_stdio(false); cin.tie(0); while (cin >> n, n) { for (int i = 0; i < n; i++) { cin >> str[i]; for (int j = 0; j < n; j++) { dp[i][j] = 1; } } ans = 1; for (int i = 1; i < n; i++) { for (int j = 0; j < n - 1; j++) { dp[i][j] = Check(i, j) + 1; ans = max(ans, dp[i][j]); } } cout << ans << endl; } return 0; }
--(完)--
动规-HDU-2859
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。