結果
| 問題 |
No.783 門松計画
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-02-14 14:21:01 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 29 ms / 2,000 ms |
| コード長 | 1,290 bytes |
| コンパイル時間 | 545 ms |
| コンパイル使用メモリ | 66,516 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-23 12:22:13 |
| 合計ジャッジ時間 | 1,417 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 27 |
ソースコード
#include<iostream>
using namespace std;
// 2つ前、1つ前のindex,所持金
int dp[51][51][101] = {};
int l[51], w[51];
bool isK(int a, int b, int c){
return l[a] != l[b] && l[b] != l[c] && l[c] != l[a] && (l[b]-l[a])*(l[b]-l[c]) > 0;
}
int main(){
int n, c;
cin >> n >> c;
for(int i = 0; i < n; i++) cin >> l[i];
for(int i = 0; i < n; i++) cin >> w[i];
// initialize
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < n; k++){
int cost = w[i]+w[j]+w[k];
if(isK(i,j,k) && cost <= c){
dp[j][k][cost] = max(dp[j][k][cost], l[i]+l[j]+l[k]);
}
}
}
}
int ans = 0;
for(int cost = 0; cost <= c; cost++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(dp[i][j][cost] == 0) continue;
for(int k = 0; k < n; k++){
int ncost = cost + w[k];
if(isK(i,j,k) && ncost <= c){
dp[j][k][ncost] = max(dp[j][k][ncost], dp[i][j][cost]+l[k]);
}
}
ans = max(ans, dp[i][j][cost]);
}
}
}
cout << ans << endl;
return 0;
}