• [noi713]魔法


    分治,维护一个dp数组,当递归到区间[l,r]时,需要保证这个dp数组维护的是除去[l,r]以外的dp数组
    维护其实很简单,就是递归左区间是先将右区间加入,然后再将左区间加入(要先复原)然后递归右区间即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 2005
     4 #define oo 0x3f3f3f3f
     5 #define mid (l+r>>1) 
     6 int n,m,a[N*10],c[N*10],f[N],ff[N],g[21][N];
     7 void add(int l,int r){
     8     for(int i=l;i<=r;i++){
     9         memcpy(ff,f,sizeof(f));
    10         for(int j=0;j<m;j++)
    11             f[j]=min(f[j],ff[(j+m-a[i])%m]+c[i]);
    12     }
    13 }
    14 void dfs(int l,int r,int s){
    15     if (l==r){
    16         long long ans=0;
    17         for(int i=0;i<m;i++)
    18             if (f[i]==oo)ans--;
    19             else ans+=f[i];
    20         printf("%lld
    ",ans);
    21         return;
    22     }
    23     memcpy(g[s],f,sizeof(f));
    24     add(mid+1,r);
    25     dfs(l,mid,s+1);
    26     memcpy(f,g[s],sizeof(f));
    27     add(l,mid);
    28     dfs(mid+1,r,s+1);
    29 }
    30 int main(){
    31     scanf("%d%d",&n,&m);
    32     for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&c[i]);
    33     memset(f,oo,sizeof(f));
    34     f[0]=0;
    35     dfs(1,n,0);
    36 }
    View Code
  • 相关阅读:
    复利计算--结对1.0,做汉堡,结对2.0
    复利计算1.0,2.0,3.0,4.0,5.0
    2020助教总结
    作业2
    作业一
    linux设置opengl版本
    第一次个人作业
    寒假助教总结
    直播
    2020面向对象程序设计寒假作业3
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11619721.html
Copyright © 2020-2023  润新知