1. 程式人生 > >[JLOI2015]戰爭調度

[JLOI2015]戰爭調度

set ret pen urn getch tchar aps 戰爭 pac

[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

[JLOI2015]戰爭調度