結果
| 問題 | No.357 品物の並び替え (Middle) | 
| コンテスト | |
| ユーザー |  xyz600600 | 
| 提出日時 | 2016-04-02 09:28:38 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 8 ms / 5,000 ms | 
| コード長 | 862 bytes | 
| コンパイル時間 | 538 ms | 
| コンパイル使用メモリ | 66,288 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-10-02 09:57:04 | 
| 合計ジャッジ時間 | 1,215 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 18 | 
ソースコード
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
  int N, M;
  cin >> N >> M;
  vector<vector<int>> table;
  for( int i = 0; i < N; i++ )
  {
	table.push_back( vector<int>( N ) );
  }
  for( int i = 0; i < M; i++ )
  {
	int f, t, v;
	cin >> f >> t >> v;
	table[ f ][ t ] = v;
  }
  const int S = 1 << N;
  // best[使ってる集合]
  vector<int> best( S );
  fill( best.begin(), best.end(), 0 );
  
  for( int i = 0; i < S - 1; i++ )
  {
	for( int j = 0; j < N; j++ ) // 今から追加する桁
	{
	  if ( !( i & ( 1 << j ) ) )
	  {
		int sub_score = 0;
		for( int k = 0; k < N; k++ ) // 既にある桁
		{
		  if ( i & ( 1 << k ) )
		  {
			sub_score += table[ k ][ j ];
		  }
		}
		best[ i + (1 << j) ] = max( best[ i + (1 << j) ], best[ i ] + sub_score );
	  }
	}
  }
  cout << best[ S - 1 ] << endl;
}
            
            
            
        