题目链接:点我点我
题意:求以左下到右上的最大对称矩阵。
题解:对于每个点(以它为一个矩阵的最左下角),判断一下它右边的第一个点和上面的第一个点,如果相同就再往下判断下去,直到不相同,取当前位置能拿到的值。
如果一直相同,说明这个最左下脚的点能够加入进去成为一员,+1呗。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int N=1111; 6 char map[N][N]; 7 int dp[N][N]; 8 9 int main(){ 10 int n; 11 12 while(cin>>n&&n){ 13 int ans=0; 14 for(int i=1;i<=n;i++) 15 for(int j=1;j<=n;j++) 16 cin>>map[i][j]; 17 18 if(n==1) {cout<<1<<endl;continue;} 19 for(int i=1;i<=n;i++) dp[i][n]=dp[1][i]=1; 20 21 for(int i=2;i<=n;i++){ 22 for(int j=1;j<n;j++){ 23 int idx=0; 24 for(int k=1;k<=dp[i-1][j+1];k++){ 25 if(map[i-k][j]!=map[i][j+k]) {dp[i][j]=k;idx=1;break;} 26 } 27 if(!idx) dp[i][j]=dp[i-1][j+1]+1; 28 ans=max(ans,dp[i][j]); 29 } 30 } 31 32 cout<<ans<<endl; 33 } 34 35 }
时间: 2024-10-06 08:32:56