我正在解决过去的Google kickstart 2019问题之一:"Flattening"
linked页的“分析”部分中描述了一种可能的DP解决方案,但是我对该方法的实现获得了测试集2的TLE。为什么?
这就是我所做的:
#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;
}
答案 0 :(得分:0)
我没有阅读问题,只是看了一下您的代码。
在C ++中,映射是一个有序的容器,插入和元素访问的平均复杂度为O(log n)。您可以将其替换为unordered_map,该映射在平均恒定时间内提供相同的操作。
此外,由于访问映射(或无序映射)中不存在的键实际上会添加带有该键的新元素(在这种情况下,默认值为零),因此您可以在R内的for循环中重写指令()功能如下:
largest_group = max(largest_group, ++rates[heights[i]]);