2 条题解
-
0VIJOS管理员----AFOer_LBW (超级牛逼卢本伟1号) LV 10 @ 2021-07-21 09:22:47
#include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <queue> #include <stack> #define rt1 rt<<1 #define rt2 (rt<<1)|1 using namespace std; int dp[(1<<11)+5][(1<<11)+5]; int v[(1<<11)+5][(1<<11)+5]; int cv[(1<<11)+5]; int ori[(1<<11)+5]; int temp[(1<<11)+5]; int lq[20],rq[20]; int n; void dfs(int rt,int l,int r,int sit,int dep) { if(l==r) { dep--; dp[rt][0]=dp[rt][1]=0; if(ori[l]) { dp[rt][1]=cv[l]; }else { dp[rt][0]=cv[l]; } for(int i=1;i<=dep;i++) { int mid=(lq[i]+rq[i])>>1; if((sit&(1<<(dep-i)))) { if(l<=mid) { dp[rt][0]+=v[l][rq[i]]-v[l][mid]; }else { dp[rt][0]+=v[l][mid]-v[l][lq[i]-1]; } }else { if(l<=mid) { dp[rt][1]+=v[l][rq[i]]-v[l][mid]; }else { dp[rt][1]+=v[l][mid]-v[l][lq[i]-1]; } } } return; } int mid=(l+r)>>1; int len=r-l+1; lq[dep]=l; rq[dep]=r; dfs(rt1,l,mid,(sit<<1),dep+1); dfs(rt2,mid+1,r,(sit<<1),dep+1); memset(temp,0x3f,sizeof(temp)); for(int i=0;i<=len/2-1;i++) { for(int j=0;j<=i;j++) { temp[i]=min(temp[i],dp[rt1][j]+dp[rt2][i-j]); } } for(int i=0;i<=len/2-1;i++) { dp[rt][i]=temp[i]; } dfs(rt1,l,mid,(sit<<1)|1,dep+1); dfs(rt2,mid+1,r,(sit<<1)|1,dep+1); memset(temp,0x3f,sizeof(temp)); for(int i=len/2;i<=len;i++) { for(int j=0;j<=i;j++) { temp[i]=min(temp[i],dp[rt1][j]+dp[rt2][i-j]); } } for(int i=len/2;i<=len;i++) { dp[rt][i]=temp[i]; } } int main() { scanf("%d",&n); n=(1<<n); for(int i=1;i<=n;i++) { scanf("%d",&ori[i]); } for(int i=1;i<=n;i++) { scanf("%d",&cv[i]); } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { scanf("%d",&v[i][j]); v[j][i]=v[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { v[i][j]=v[i][j-1]+v[i][j]; } } memset(dp,0x3f,sizeof(dp)); dfs(1,1,n,0,1); int ans=2147483647; for(int i=0;i<=n;i++) { ans=min(ans,dp[1][i]); } printf("%d\n",ans); return 0; }
-
-22016-01-10 18:23:44@
虽然我没有AC但我来抢个沙发
- 1
信息
- ID
- 1831
- 难度
- 4
- 分类
- (无)
- 标签
- 递交数
- 37
- 已通过
- 17
- 通过率
- 46%
- 被复制
- 2
- 上传者