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

  • 时间:2016-03-29 15:53:01 星期二

  • 题目编号:[2016-03-29][HDU][2859][Phalanx]

  • 分析:dp[i][j]表示以 (i,j)为左下角

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int maxn = 1000 + 10;
  5. char a[maxn][maxn];
  6. int dp[maxn][maxn],ans,n;
  7. void func(int x,int y){
  8. int maxl = min(x,n - y);
  9. int i;
  10. for(i = 0;i <= maxl;++i){
  11. if(a[x - i][y] != a[x][y + i]) break;
  12. }
  13. if(i >= dp[x - 1][y + 1] + 1){
  14. dp[x][y] = dp[x - 1][y + 1] + 1;
  15. }else dp[x][y] = i;
  16. if(dp[x][y] > ans) ans = dp[x][y];
  17. }
  18. int main(){
  19. while(~scanf("%d",&n) && n){
  20. for(int i = 1;i <= n ; ++i){
  21. scanf("%s",a[i] + 1);
  22. }
  23. ans = 0;
  24. for(int i = 1; i <= n ; ++i)
  25. for(int j = n ;j > 0;--j)
  26. func(i,j);
  27. printf("%d\n",ans);
  28. }
  29. return 0;
  30. }

来自为知笔记(Wiz)

时间: 2024-10-16 01:21:36

[2016-03-29][HDU][2859][Phalanx]的相关文章

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 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元素的最大对称度 每到一个元素的时候,往上边和右边扩展看字符最优的对称长度 与dp[i - 1][j - 1]进行比较取最优即可. 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algori

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)

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

2016/03/29

什么是数组?数组是存储在一个内块中的元素集合.可以减少内存中变量搜索时间.arr[3]  表示三个长度的数组.为什么要用数组?单一值类型变量有时候很难满足应用程序的设计要求.声明数组    格式    int[ ] i(变量).     int i [ ]   //不推荐使用age= new int[28]:  //命名了28个int空间 ,并且每个空间初始化为0[index(数据)]//index 是索引length 属性求出长度.数组初始化:  ①直接使用 { }   ②使用new 加上 {

2016.03.29///Java学习记录③

package 身高5尺7寸;   import java.util.Scanner;   public class 身高5尺7寸 {       public static void main(String[] args) {           System.out.println("该人身高为" +  (( 5 + 7/ 12) * 0.3048)  +"m");             System.out.println("该人身高为"

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)推过来的.因

2016.03.29///Java学习记录②

题目:将5尺7寸的身高转换成多少多少米 (5+7/12)*0.3048 看了题目后敲得代码,命名为①,错误: package 身高5尺7寸; import java.util.Scanner; public class 身高5尺7寸 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.printf("请输入身高尺:");  String Chi = in.n