結果

提出番号 2451
提出者 ponta2326
言語 C++
提出日時 2025-05-11 17:09:35
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8144KB
2 AC 100% 2ms 8096KB
3 AC 100% 2ms 8080KB
4 AC 100% 2ms 8192KB
5 AC 100% 2ms 8208KB
6 AC 100% 2ms 8208KB
7 AC 100% 3ms 8336KB
8 AC 100% 2ms 7904KB
9 AC 100% 2ms 8112KB
10 AC 100% 2ms 8528KB
11 AC 100% 2ms 8336KB
12 AC 100% 2ms 7888KB
13 AC 100% 2ms 7888KB
14 AC 100% 2ms 8528KB
15 AC 100% 2ms 8576KB
16 AC 100% 3ms 8160KB
17 AC 100% 2ms 8160KB
18 AC 100% 2ms 8384KB
19 AC 100% 2ms 8384KB
20 AC 100% 3ms 8320KB
21 AC 100% 2ms 8576KB
22 AC 100% 3ms 8272KB
23 AC 100% 2ms 8576KB
24 AC 100% 5ms 8160KB
25 AC 100% 3ms 8112KB
26 AC 100% 3ms 8592KB
27 AC 100% 3ms 8480KB
28 AC 100% 2ms 8368KB
29 AC 100% 10ms 8416KB
30 AC 100% 3ms 8128KB

ソースコード

#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>
#include <tuple>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <cassert>
#include <unordered_set>
#include <unordered_map>
using namespace std;
typedef long long ll;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define all(v) v.begin(), v.end()

ll llpow(ll a, ll t)
{
  ll res = 1;
  rep(i, t) res *= a;
  return res;
}

ll inf = std::numeric_limits<ll>::max();

vector<vector<ll>> drc = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
vector<char> mrk = {'^', 'v', '<', '>'};

// s: i個のアルゴリズムの集合
// dp[s]: i個のアルゴリズムを勉強する最短時間
// dp[s] = min(dp[s - {i}] + cst(s\{i} + {i})): 漸化式
// aij: 勉強jの前にiを勉強するとaij短くなる

int main()
{
  ll n;
  cin >> n;
  vector<ll> ts(n);
  vector<vector<ll>> as(n, vector<ll>(n));
  rep(i, n)
  {
    cin >> ts[i];
  }
  rep(i, n)
  {
    rep(j, n)
    {
      cin >> as[i][j];
    }
  }
  vector<ll> dp(1 << n, inf);
  dp[0] = 0;
  rep(i, 1 << n)
  {
    rep(j, n) // j: これから勉強するやつ
    {
      if (!(i >> j & 1))
      {
        ll sum = 0;
        rep(k, n) // k: 既に勉強したやつ
        {
          if (i >> k & 1)
          {
            sum += as[k][j];
          }
        }
        dp[i | 1 << j] = min(dp[i | 1 << j], dp[i] + ts[j] - sum);
      }
    }
  }
  cout << dp[(1 << n) - 1] << endl;
}