GoogleCodeJam 2009 Round 1C C. Bribe the Prisoners
動的計画法。
i番目の囚人の位置をp[i]として、i番目の囚人とj番目の囚人を解放した後、i番目とj番目の間に居る囚人を解放するのに要するコインをcoin[i][j]とすると。
coin[i][j] = mini<c<j coin[i][c]+coin[c][j] + p[j]-p[i]-2
for n in range(input()): P,Q = [int(x) for x in raw_input().split()] rel = [0]+[int(x) for x in raw_input().split()]+[P+1] coin = [[0]*(Q+2) for i in range(Q+2)] for w in range(2,Q+2): for i in range(Q+2-w): coin[i][i+w] = min([coin[i][c]+coin[c][i+w] for c in range(i+1,i+w)])+(rel[i+w]-rel[i]-2) print "Case #%s: %s" % (n+1,coin[0][Q+1])