HDU 2859
本来很简单一道题
开始想复杂了,最初想法其实就是顺畅的DP思路,但是以往做的DP,都是DP的终点就是我们所求的最优解。所以一开始没了思路,等看到Kuangbin大神的代码,就看他简述的思路就知道自己最初的思路是正确的。教训有两个吧,一个是僵硬的求“正确的”做法,一个是没有培养自己分析时间复杂度的习惯。
过程中还因为玄学问题和全局最优值转移的疏忽总共贡献了3发WA,实在不应该
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn= 1005;
char mt[maxn][maxn];
int dv[maxn];
int n;
int main()
{
while (true){
scanf("%d", &n);
if (0== n){
break;
}
int ans= 1;
for (int i= 0; i< n; ++i){
scanf(" %s", mt[i]);
}
for (int i= 0; i< n; ++i){
dv[i]= 1;
}
dv[n]= 0;
for (int i= 1; i< n; ++i){
for (int j= 0; j< n; ++j){
if (n-1== j){
dv[j]= 1;
continue;
}
int x, y, k;
for (x= i-1, y= j+1; x>= 0 && y< n && mt[x][j]== mt[i][y]; --x, ++y){
}
k= i-x;
if (k> dv[j+1]){
dv[j]= dv[j+1]+1;
}
else{
dv[j]= k;
}
if (dv[j]> ans){
ans= dv[j];
}
}
}
printf("%d\n", ans);
}
return 0;
}