Я решаю одну из прошлых проблем Google Kickstart 2019: «Уплощение»
Возможное решение DP описано в разделе «Анализ» на странице связанный , но моя реализация этого подхода получает TLE для набора тестов 2. Почему?
Вот что я сделал:
#include <iostream>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;
int heights[200];
int T,N,K;
int memo[200][200];
int R(int I,int J){
map<int,int> rates;
int largest_group = -1;
for(int i=I;i<=J;i++){
if(rates.find(heights[i]) == rates.end()) rates[heights[i]] = 1;
else rates[heights[i]] ++;
if(rates[heights[i]] > largest_group) largest_group = rates[heights[i]];
}
return J-I+1 - largest_group;
}
int P(int Z,int K){
if(Z<=0) return 0;
if(K==0) return R(0,Z);
if(memo[Z][K] != -1) return memo[Z][K];
int res = 1000000;
for(int i=0;i<=Z;i++)
res = min( res, P(i-1,K-1)+R(i,Z) );
return (memo[Z][K] = res);
}
int main(){
cin>>T;
int t = 0;
while(++t <= T){
memset(memo,-1,sizeof memo);
cin>>N>>K;
for(int i=0;i<N;i++)
cin>>heights[i];
cout<<"Case #"<<t<<": "<<P(N-1,K)<<endl;
}
return 0;
}