Подпоследовательность с использованием одной строки
Дана строка S длиной N. Выберите целое число K и две непустые подпоследовательности A и B символов этой строки, каждая длиной K, такие, что:
>> A=B, то есть для каждого действительного i i-й символ в A совпадает с i-м символом в B.
обозначим индексы символов, используемых для построения A через a1,a2,...,aK, т. е.
A=(Sa1,Sa2,...,SaK). Аналогично обозначим индексы символов, используемых для построения B, через b1,b2,...,bK.
если обозначить число общих индексов в последовательностях a и b через M, то M+1≤K.
Каково максимальное значение K, чтобы можно было найти последовательности A и B, удовлетворяющие вышеприведенным условиям?
Ввод
первая строка входных данных содержит одно целое число T, обозначающее количество тестовых случаев. Описание тестов t следующим образом.
>>первая строка каждого тестового случая содержит одно целое число N.
&ГТ;&ГТ;вторая строка содержит строку s длины Н.
Шаблон вывода
Для каждого теста выведите одну строку, содержащую одно целое число ― максимум K, или 0, если нет решения.
Код, который я попробовал ниже, работает для любого ввода, который я даю. Но все равно всякий раз, когда я отправляю код, он показывает WA
Что я уже пробовал:
#include <iostream> #include <vector> #include <map> #include <string> #include <algorithm> using namespace std; #define boost ios::sync_with_stdio(0); cin.tie(0) int findLongestRepeatingSubSeq(string s){ int len = s.length(); if(len<=1)return 0; vector<vector<int>>dp(len+1,vector<int>(len+1,0)); for(int i=1;i<=len;i++){ for(int j=1;j<=len;j++){ if(s[i-1]==s[j-1] && i!=j){ dp[i][j] = dp[i-1][j-1]+1; }else{ dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } return dp[len][len]; } int main(){ boost; int t; cin >> t; while(t--) { int n; cin >> n; string str; cin >> str; cout << findLongestRepeatingSubSeq(str) << endl; } }
Я не знаю, что делаю не так. Так что я очень ценю любую помощь в этом вопросе