結果
| 問題 |
No.437 cwwゲーム
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-10-28 22:37:28 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 9 ms / 2,000 ms |
| コード長 | 1,590 bytes |
| コンパイル時間 | 1,082 ms |
| コンパイル使用メモリ | 104,216 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-12 08:22:09 |
| 合計ジャッジ時間 | 2,351 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
ソースコード
#define _USE_MATH_DEFINES
#include <cstdio>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <complex>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <limits>
#include <climits>
#include <cfloat>
#include <functional>
#include <iterator>
using namespace std;
template <size_t T>
bool nextBitset(bitset<T> &bs, int digit)
{
if(bs.none())
return false;
bitset<T> x, y, z;
x = bs.to_ulong() & (~(bs.to_ulong()) + 1ULL);
y = bs.to_ulong() + x.to_ulong() + 0ULL;
z = bs & ~y;
if(bs[digit-1] && bs == z)
return false;
bs = ((z.to_ulong() / x.to_ulong()) >> 1) + 0ULL;
bs |= y;
return true;
}
int main()
{
string s;
cin >> s;
int n = s.size();
vector<int> dp((1<<n), 0);
for(int x=0; x<(1<<n); ++x){
bitset<32> bs(x);
for(int i=0; i<n; ++i){
for(int j=i+1; j<n; ++j){
for(int k=j+1; k<n; ++k){
if(!bs[i] && !bs[j] && !bs[k] && s[i] != '0' && s[i] != s[j] && s[j] == s[k]){
bitset<32> bs2 = bs;
bs2[i] = bs2[j] = bs2[k] = true;
int score = (s[i] - '0') * 100 + (s[j] - '0') * 10 + (s[k] - '0');
dp[bs2.to_ulong()] = max(dp[bs2.to_ulong()], dp[x] + score);
}
}
}
}
}
cout << dp.back() << endl;
return 0;
}