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;
}
posted @ 2021-04-02 13:15  IdiotNe  阅读(38)  评论(0编辑  收藏  举报