为什么该DP解决方案提供TLE?

时间:2019-10-13 07:28:05

标签: c++ dynamic-programming acm-icpc

我正在解决过去的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;
    }

1 个答案:

答案 0 :(得分:0)

我没有阅读问题,只是看了一下您的代码。

在C ++中,映射是一个有序的容器,插入和元素访问的平均复杂度为O(log n)。您可以将其替换为unordered_map,该映射在平均恒定时间内提供相同的操作。

此外,由于访问映射(或无序映射)中不存在的键实际上会添加带有该键的新元素(在这种情况下,默认值为零),因此您可以在R内的for循环中重写指令()功能如下:

largest_group = max(largest_group, ++rates[heights[i]]);