zoukankan      html  css  js  c++  java
  • hdoj2859(矩阵DP)

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

    思路:

    第一次碰到这种矩阵上的DP题,想了半天也没想明白。本来想用子矩阵的左上角坐标和右下角坐标当作状态,但这样内存肯定是不够的。后来网上查了就明白了。

    用dp[i][j]表示以(i,j)为左下角的矩阵的维数最大值,然后在斜边上DP,建立dp[i][j]与dp[i-1][j+1]的联系。具体思路见代码,仔细想想就明白了。也学到关于矩阵的题目多考虑对角线。我在这wa了一发,原因是我将res初始化为0,而如果输入数据是n=1(即一维),结果应该是1,而我的程序结果是0,把res初始化为1就行了,以后要多注意特殊情况。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n,res,dp[1005][1005];
     5 char a[1005][1005];
     6 
     7 int main(){
     8     while(~scanf("%d",&n),n){
     9         res=1;
    10         for(int i=0;i<n;++i)
    11             scanf("%s",a[i]);
    12         for(int i=0;i<n;++i)
    13             for(int j=0;j<n;++j){
    14                 if(i==0||j==n-1){
    15                     dp[i][j]=1;
    16                     continue;
    17                 }
    18                 int ti=i-1,tj=j+1;
    19                 while(ti>=0&&tj<n&&a[ti][j]==a[i][tj])
    20                     ti--,tj++;
    21                 int t=i-ti;
    22                 if(t>=dp[i-1][j+1]+1) dp[i][j]=dp[i-1][j+1]+1;
    23                 else dp[i][j]=t;
    24                 if(dp[i][j]>res) res=dp[i][j];
    25             }
    26         printf("%d
    ",res);
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    CF1442E. Black, White and Grey Tree
    CF1442D. Sum
    CF1444D. Rectangular Polyline
    arc107F
    外心与垂心关系
    CF1434E. A Convex Game
    CF1434D. Roads and Ramen
    arc106E
    arc106F
    CF704E. Iron Man
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10439709.html
Copyright © 2011-2022 走看看