ZOJ 3502 Contest (狀態壓縮+DP , py大法好)

今天連續更新三篇文章呢,習慣在文章前面寫一些無(fei)關(hua)緊(lian)要(pian)的東西。

訓練賽到最後也沒有水過去,真是傷心,精度卡得很死,當時要是用decimal可能就OK了,本來想實驗的,但是zoj好像開不了。

題目的意思就是最多十條題目,找一個最優排列,並輸出期望,每道題的期望max(matrix[][j])。

用狀態壓縮搞出排列2^10,再dp,dp比較明顯。

寫的代碼是py,也就是20行代碼,但是理解倒不容易。

import sys
T=int(sys.stdin.readline())
for cases in xrange(T):
    n=int(sys.stdin.readline())
    dp,s,mtr=[0]+[-1.0]*(1<<n) ,['']*(1<<n),[]
    eps,end=1e-10,(1<<n)-1
    for i in xrange(n):
        mtr.append(sys.stdin.readline().strip().split(' '))
    for i in xrange(n):
        for j in xrange(n):
            mtr[i][j]=int(mtr[i][j])/100.0
    for i in xrange(1,end+1):
        for j in xrange(n):
            if i & (1<<j):
                p,m=0.0 , i-(1<<j)
                for k in xrange(n):
                    p=max(p,mtr[k][j]) if i & (1<<k) else p 
                if dp[i] +eps < dp[m]+p  or  dp[i] - eps < dp[m]+p and s[i] > s[m]:
                    dp[i],s[i]= dp[m]+p,s[m]+chr(65+j)
    print '%.2f\n%s'%(dp[end],s[end])


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章