1

このタスクに問題があります。http://www.spoj.com/problems/LINEUP/非常に簡単に見えますが、私のソリューションは失敗します。私は間違った結果を得ています。誰でもそれを理解するのを助けることができますか? 助けてくれてありがとう。:-)

#include <cstdio>
#include <string.h>
using namespace std;

int n;
int prob[21][21];

char vec_rijesio[1<<13];
int memo[1<<13];
int rijesi( int d, int s ) {
   if ( d == 11 )
     {
       return 0;
     }
   if ( vec_rijesio[s] ) return memo[s];
   vec_rijesio[s] = 1;
   int &ret = memo[s];
   ret = 0;

   for ( int i=0; i<11; ++i )
      if ( ( s & (1<<i) ) == 0 ) {
         int tmp = prob[d][i] + rijesi(d + 1, s|(1<<i));
         if ( tmp > ret ) ret = tmp;
      }

   return ret;
}

int main() {
   scanf( "%d", &n );
   for(int o=0;o<n;++o)
   {
   for ( int i=0; i<11; ++i )
      for ( int j=0; j<11; ++j ) {
         int x;
         scanf( "%d", &x );
         prob[i][j] = x;
      }

   int ret = rijesi( 0, 0 );
   printf( "%d\n", ret);
   memset (memo,0,sizeof(memo));
   memset (vec_rijesio,0,sizeof(vec_rijesio));
   }
   return 0;
}
4

2 に答える 2

1

問題は割り当て問題です。ハンガリーのアルゴリズムを使用して、強みを否定し、全体の弱みを最小限に抑えます。あなたはそれをグーグルすることができます。

ゼロの強みは、非常に高い正の弱みになります。

于 2013-10-26T20:24:11.653 に答える