题目链接: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\n",res); 27 } 28 return 0; 29 }