結果

提出番号 1416
提出者 olphe
言語 C++
提出日時 2018-08-02 21:45:46
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8720KB
2 AC 100% 2ms 8016KB
3 AC 100% 2ms 8416KB
4 AC 100% 2ms 8128KB
5 AC 100% 2ms 8064KB
6 AC 100% 2ms 8432KB
7 AC 100% 2ms 8448KB
8 AC 100% 2ms 8416KB
9 AC 100% 2ms 8368KB
10 AC 100% 2ms 7536KB
11 AC 100% 2ms 8400KB
12 AC 100% 1ms 8256KB
13 AC 100% 2ms 8032KB
14 AC 100% 1ms 8688KB
15 AC 100% 2ms 8432KB
16 AC 100% 2ms 8160KB
17 AC 100% 2ms 8432KB
18 AC 100% 2ms 8736KB
19 AC 100% 2ms 8384KB
20 AC 100% 4ms 7680KB
21 AC 100% 2ms 7968KB
22 AC 100% 3ms 7984KB
23 AC 100% 2ms 8432KB
24 AC 100% 4ms 7984KB
25 AC 100% 2ms 8720KB
26 AC 100% 3ms 7984KB
27 AC 100% 3ms 8448KB
28 AC 100% 2ms 7648KB
29 AC 100% 11ms 7872KB
30 AC 100% 2ms 7520KB

ソースコード

#include "iostream"
#include "climits"
#include "list"
#include "queue"
#include "stack"
#include "set"
#include "functional"
#include "algorithm"
#include "string"
#include "map"
#include "unordered_map"
#include "unordered_set"
#include "iomanip"
#include "cmath"
#include "random"
#include "bitset"
#include "cstdio"

using namespace std;

const long long int MOD = 1000000007;
const long double EPS = 1e-8;

long long int N, M, K, H, W, L, R;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> N;
	vector<int>v(N);
	vector<vector<int>>w(N, vector<int>(N));
	for (int i = 0; i < N; i++) {
		cin >> v[i];
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> w[i][j];
		}
	}
	vector<int>dp(1 << N, MOD);
	dp[0] = 0;
	for (int i = 0; i < 1 << N; i++) {
		for (int j = 0; j < N; j++) {
			if (i & (1 << j)) {
				continue;
			}
			int add = v[j];
			for (int k = 0; k < N; k++) {
				if (i & (1 << k)) {
					add -= w[k][j];
				}
			}
			dp[i + (1 << j)] = min(dp[i + (1 << j)], dp[i] + add);
		}
	}
	cout << dp.back() << endl;
	return 0;
}