The Swap (SRM 437 Div2 500)

The Swap (SRM 437 Div2 500)

题目链接:http://www.topcoder.com/stat?c=problem_statement&pm=10369&rd=13699
一开始想贪心+递归做。。。始终fail systemtest。。
贪心无法证明,还是用dp了。

若用递推,复杂度为O(10^6*10*50)=O(5*10^8),应该会超时。。可能在tc的牛机上不会超。。。
用memoization的dp就不会超了,因为大部分状态是不会到达的。

#include  < algorithm >
#include 
< sstream >
#include 
< string >
#include 
< iostream >

// 44M内存。。。空间不会超
int  dp[ 1000001 ][ 11 ];

using   namespace  std;

         
class  TheSwap
              { 
              
public


              
int  findMax( int  n,  int  k) 
                  { 
                      
                     //  memset -1 从语义上说是不对的,只是-1为全1,4个byte恰好拼成一个int时还是-1
                      memset(dp, - 1 , sizeof (dp));

                     
// 将n转化成字符串。 貌似gcc不支持 itoa函数,不是标准函数
                      stringstream ss;
                      ss
<< n;
                      
string  s;
                      ss
>> s;

                      
return  _findMax(s,k);

                  }

                  
int  _findMax( string   & s, int  k){

                      
int  n  =  atoi(s.c_str());

                      
if (k == 0 )
                          
return  n;

                      
if (dp[n][k] !=- 1 )
                          
return  dp[n][k];

                      
for ( int  i = 0 ;i < s.size(); ++ i){
                          
for ( int  j = i + 1 ;j < s.size(); ++ j){
                              
if (s[j] == ' 0 ' && i == 0 ){
                                  
//  invalid 
                                   continue ;
                              }
                              swap(s[i],s[j]);
                              dp[n][k] 
=  max(dp[n][k],_findMax(s,k - 1 ));
                              swap(s[i],s[j]);
                          }
                      }

                     
return  dp[n][k];
                  }
 


你可能感兴趣的:(The Swap (SRM 437 Div2 500))