結果

提出番号 1920
提出者 eiya
言語 C++
提出日時 2018-08-04 14:33:35
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8432KB
2 AC 100% 2ms 7968KB
3 AC 100% 2ms 8256KB
4 AC 100% 2ms 8496KB
5 AC 100% 2ms 7984KB
6 AC 100% 2ms 7552KB
7 AC 100% 2ms 7904KB
8 AC 100% 2ms 8736KB
9 AC 100% 2ms 8144KB
10 AC 100% 2ms 7616KB
11 AC 100% 2ms 8352KB
12 AC 100% 2ms 8128KB
13 AC 100% 2ms 8384KB
14 AC 100% 2ms 8400KB
15 AC 100% 2ms 8416KB
16 AC 100% 2ms 8416KB
17 AC 100% 2ms 8704KB
18 AC 100% 2ms 8448KB
19 AC 100% 2ms 8352KB
20 AC 100% 2ms 8272KB
21 AC 100% 2ms 7888KB
22 AC 100% 2ms 8000KB
23 AC 100% 2ms 7824KB
24 AC 100% 3ms 7776KB
25 AC 100% 2ms 8000KB
26 AC 100% 2ms 7888KB
27 AC 100% 3ms 8448KB
28 AC 100% 2ms 7504KB
29 AC 100% 9ms 7984KB
30 AC 100% 2ms 8096KB

ソースコード


#if 1
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <stack>
#include <array>
#include <deque>
#include <algorithm>
#include <utility>
#include <cstdint>
#include <functional>
#include <iomanip>
#include <numeric>
#include <assert.h>
#include <bitset>
#include <list>

auto& in = std::cin;
auto& out = std::cout;

int32_t N;

int32_t cost[16];
int32_t minus[16][16];
int32_t dp[1 << 16];


template<typename T>
void fill_all(T& arr, const T& v) {
	arr = v;
}
template<typename ARR, typename U>
void fill_all(ARR& arr, const U& v) {
	for (auto& i : arr) { fill_all(i, v); }
}

int32_t func(std::bitset<16> mask)
{
	if (mask == 0) { return 0; }
	if (dp[mask.to_ulong()] != -1) {
		return dp[mask.to_ulong()];
	}

	int32_t cost2[16] = {};
	for (int32_t i = 0; i < N; i++){
		cost2[i] = cost[i];
	}
	for (int32_t i = 0; i < N; i++)
	{
		if (!mask[i]) {
			for (int32_t j = 0; j < N; j++) {
				cost2[j] = std::max(0, cost2[j] - minus[i][j]);
			}
		}
	}

	int32_t res = 10001616;
	for (int32_t i = 0; i < N; i++)
	{
		if (mask[i]) {
			mask[i] = false;
			res = std::min(res, func(mask)+cost2[i]);
			mask[i] = true;
		}
	}
	return dp[mask.to_ulong()] = res;
}

int main()
{
	using std::endl;
	in.sync_with_stdio(false);
	out.sync_with_stdio(false);
	in.tie(nullptr);
	out.tie(nullptr);

	fill_all(dp, -1);

	in >> N;
	for (int32_t i = 0; i < N; i++)
	{
		in >> cost[i];
	}
	for (int32_t i = 0; i < N; i++)
		for (int32_t j = 0; j < N; j++)
	{
		in >> minus[i][j];
	}

	out << func((1 << N) - 1) << endl;;

	return 0;
}
#endif