zoukankan      html  css  js  c++  java
  • [JLOI2015]战争调度

    [JLOI2015]战争调度

    题目

    解题报告

    考试打了个枚举的暴力,骗了20= =

    $qsy$大佬的$DP$:

    其实就是枚举= =,只不过枚举的比较强= =

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 inline int read(){
     6     int sum(0);
     7     char ch(getchar());
     8     for(;ch<'0'||ch>'9';ch=getchar());
     9     for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
    10     return sum;
    11 }
    12 typedef long long L;
    13 int n,m,tot;
    14 L w[1050][15],f[1050][15];
    15 L dp[1050][1050];
    16 inline void dfs(int rt,int dep,int st){
    17     memset(dp[rt],0,sizeof(dp[rt]));
    18     if(dep==n-1){
    19         for(int i=0;i<dep;++i){
    20             if(st&(1<<i))
    21                 dp[rt][1]+=w[rt][i];
    22             else
    23                 dp[rt][0]+=f[rt][i];
    24         }
    25         return;
    26     }
    27     int size(1<<(n-dep-1));
    28     dfs(rt<<1,dep+1,st);
    29     dfs(rt<<1|1,dep+1,st);
    30     for(int i=0;i<=(size>>1);++i){
    31         if(i>m)
    32             break;
    33         for(int j=0;j<=(size>>1);++j){
    34             if(i+j>m)
    35                 break;
    36             dp[rt][i+j]=max(dp[rt][i+j],dp[rt<<1][i]+dp[rt<<1|1][j]);
    37         }
    38     }
    39     dfs(rt<<1,dep+1,st|(1<<dep));
    40     dfs(rt<<1|1,dep+1,st|(1<<dep));
    41     for(int i=0;i<=(size>>1);++i){
    42         if(i>m)
    43             break;
    44         for(int j=0;j<=(size>>1);++j){
    45             if(i+j>m)
    46                 break;
    47             dp[rt][i+j]=max(dp[rt][i+j],dp[rt<<1][i]+dp[rt<<1|1][j]);
    48         }
    49     }
    50 }
    51 int main(){
    52     n=read(),m=read(),tot=(1<<n)-1;
    53     for(int i=1;i<=(1<<(n-1));++i)
    54         for(int j=n-2;j>=0;--j)
    55             w[(1<<(n-1))+i-1][j]=read();
    56     for(int i=1;i<=(1<<(n-1));++i)
    57         for(int j=n-2;j>=0;--j)
    58             f[(1<<(n-1))+i-1][j]=read();
    59     dfs(1,0,0);
    60     L ans(0);
    61     for(int i=0;i<=m;++i)
    62         ans=max(ans,dp[1][i]);
    63     printf("%lld",ans);
    64 }
    View Code
  • 相关阅读:
    算符优先分析
    自下而上语法分析
    递归下降语法分析
    LL(1)文法的判断,递归下降分析程序
    消除左递归
    4.K均值算法--应用
    2.机器学习相关数学基础
    K均值算法
    机器学习概述
    算符优先分析
  • 原文地址:https://www.cnblogs.com/hzoi-mafia/p/7617129.html
Copyright © 2011-2022 走看看