[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 }
时间: 2024-10-10 05:41:04