結果

提出番号 1653
提出者 ats5515
言語 C++
提出日時 2018-08-04 13:23:21
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 7840KB
2 AC 100% 2ms 8720KB
3 AC 100% 2ms 8736KB
4 AC 100% 2ms 8096KB
5 AC 100% 2ms 7248KB
6 AC 100% 2ms 8432KB
7 AC 100% 2ms 8416KB
8 AC 100% 2ms 7536KB
9 AC 100% 2ms 8656KB
10 AC 100% 2ms 8432KB
11 AC 100% 2ms 8256KB
12 AC 100% 2ms 8480KB
13 AC 100% 2ms 8352KB
14 AC 100% 2ms 7648KB
15 AC 100% 2ms 8144KB
16 AC 100% 2ms 8416KB
17 AC 100% 2ms 7808KB
18 AC 100% 2ms 7920KB
19 AC 100% 2ms 8736KB
20 AC 100% 2ms 8448KB
21 AC 100% 1ms 8736KB
22 AC 100% 2ms 8464KB
23 AC 100% 2ms 7840KB
24 AC 100% 4ms 8016KB
25 AC 100% 2ms 8080KB
26 AC 100% 3ms 8048KB
27 AC 100% 4ms 8720KB
28 AC 100% 2ms 7968KB
29 AC 100% 13ms 8080KB
30 AC 100% 3ms 8176KB

ソースコード

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
#define int long long
int MOD = 1000000007;
vector<vector<int> > A;
int N;
vector<int> T;
vector<int> dp;
int rec(int a) {
	if (dp[a] != -1)return dp[a];
	int t;
	dp[a] = (int)1 << 60;
	for (int j = 0; j < N; j++) {
		if ((a & (1 << j)) == 0) {
			t = T[j];
			for (int i = 0; i < N; i++) {
				if ((a & (1 << i))) {
					t -= A[i][j];
				}
			}
			dp[a] = min(dp[a], rec(a | (1 << j)) + t);
		}
	}
	return dp[a];
}
signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	
	cin >> N;
	T.resize(N);
	int res = 0;
	for (int i = 0; i < N; i++) {
		cin >> T[i];
	}
	A.resize(N, vector<int>(N));
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> A[i][j];
		}
	}
	dp.resize(1 << N, -1);
	dp[(1 << N) - 1] = 0;
	cout << rec(0) << endl;
}