AOJ 2502 VOCAL ANDROID
続きです。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2502
サンプルケース通ったのに、ダメだったパターン。解答見ても謎。間違ってるところがわからないです。
わかる方いましたらコメントしてください。僕が喜びます。
WAコード
N = int(input())
s, l, p = ([], [], [])
for i in range(N):
ss, ll, pp = [int(j) for j in input().split()]
s.append(ss); l.append(ll); p.append(pp)
M = int(input())
w = []
for i in range(M):
w.append(int(input()))
"""
def rec(pos, end, m):
if pos == N or end >= m:
if end == m:
return 0
return -100000
ans = rec(pos+1, end, m)
for i in range(s[pos], l[pos]+1):
ans = max(ans, rec(pos+1, end+i, m) + p[pos])
return ans
for i in w:
print(rec(0, 0, i))
# rec2
def rec(pos, m):
if pos == N or m <= 0:
if m == 0:
return 0
return -100000
# 入れないパターン
ans = rec(pos+1, m)
# 入れるパターン
for i in range(s[pos], l[pos]+1):
ans = max(ans, rec(pos+1, m-i) + p[pos])
return ans
for i in w:
print(rec(0, i))
"""
dp = [[0 for j in range(400+1)] for i in range(N+1)]
for i in range(N-1, -1, -1):
for j in range(0, 400):
dp[i][j] = dp[i+1][j]
for k in range(s[i], l[i]+1):
if j-k >= 0:
dp[i][j] = max(dp[i][j], dp[i+1][j-k] + p[i])
for i in w:
if dp[0][i] == 0:
print(-1)
break
else:
for i in w:
print(dp[0][i])
次は、他の人のACコード真似たやつです。pythonだとTLEですけどw
dp = [0 for i in range(400)]
n = int(input())
for i in range(1, n+1):
s, l, p = map(int, input().split())
for j in range(1, 400):
for k in range(s, l+1):
if j-k >= 0:
dp[j] = max(dp[j], dp[j-k]+p)
m = int(input())
ws = []
for i in range(m):
w = int(input())
if dp[w] == 0:
print(-1)
break
ws.append(w)
else:
for w in ws:
print(dp[w])
これは、1 次元dpでできるんだなという知見を得ました。
追記:
復習目的として、1次元にしたら無事TLEになったので、そういう問題なんだなという認識を得ました。
n = int(input()) s, l, p = ([], [], []) for i in range(n): ss, ll, pp = map(int, input().split()) s.append(ss); l.append(ll); p.append(pp) """ def rec(pos, v): if pos==n or v <= 0: if v == 0: return 0 return -10000 ans = rec(pos+1, v) for i in range(s[pos], l[pos]+1): if not v-i < 0: ans = max(ans, rec(pos+1, v-i)+p[pos]) return ans """ m = int(input()) w = [] for i in range(m): w.append(int(input())) """ for ww in w: print(rec(0, ww)) """ dp = [0 for i in range(401)] for i in range(n-1, -1, -1): for j in range(0, 400): for k in range(s[i], l[i]+1): if j-k >= 0: dp[j] = max(dp[j], dp[j-k]+p[i]) for ww in w: if dp[ww] == 0: print(-1) break else: for ww in w: print(dp[ww])
ふむ。