bzoj1076(상압dp)(기대dp)

2919 단어 dp
전송문 문제: dp[i][j]는 i라운드 상태가 j(상태 중 1의 위치는 현재 아이템이 아직 빼앗기지 않았음을 표시)의 최대 기대 점수를 나타낸다.무효 상태에서 유효 상태로 전이되는 것을 방지하기 위해 역추법으로 이미 알고 있는 유효 상태에서 역추하여 코드에 구체적으로 설명한다.P.S.memset을 쓰지 않으면 두 배 가까이 빠를 수 있지만 엄밀성을 위해 하나를 쓴다. 어차피 통과할 수 있다. 주의: 먹은 보물은 다시 먹을 수 있기 때문에 (전제 집합만 만족) if문장은 다음과 같은 조건을 더할 수 없다. (j&(1<)
#include
using namespace std;
const int MAXN=17;
int K,n,temp;
int val[MAXN],st[MAXN];
double dp[102][1<<17];
int main() {
//  freopen("bzoj 1076.in","r",stdin);
    scanf("%d%d",&K,&n);
    for (int i=1;i<=n;++i) {
        scanf("%d%d",&val[i],&temp);
        while (temp) st[i]+=(1<1)),scanf("%d",&temp);
    }
    memset(dp,0,sizeof(dp));
    for (int i=K;i;--i)
        for (int j=0;j<=(1<1;++j) {
            for (int k=1;k<=n;++k)
                if ((st[k]&j)==st[k])//st[k] j   ,     
                    dp[i][j]+=max(dp[i+1][j],dp[i+1][j|(1<1))]+val[k]);
                else dp[i][j]+=dp[i+1][j];
            dp[i][j]/=n;//   1/n
        }
    printf("%.6lf
"
,dp[1][0]); return 0; }

좋은 웹페이지 즐겨찾기