zoukankan      html  css  js  c++  java
  • [Codeforces958C2]Encryption (medium)(区间DP)

    Description

    题目链接

    Solution

    显然的区间DP,正常想法f[i][j]表示前i个数分成j块,每次在i前找一个k使得balala,然而常规打法会超时

    我们发现,对于i前面的所有点,他们的值在[0,p)之间,而有些f[k][j-1]的值是相同的,而他们的贡献也是一样的,

    所以直接枚举[0,p)即可,

    然后可以进一步优化空间,f[i][j]表示膜p为i分为j块的最大价值

    Code

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    int n,m,mo,s[20010],f[110][60],g[60];
    
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    
    int main(){
        n=read(),m=read(),mo=read();
        for(int i=1;i<=n;++i) s[i]=(s[i-1]+read())%mo;
        memset(f,128,sizeof(f));
        f[0][0]=0;
        for(int i=1;i<=n;++i){
        	memset(g,128,sizeof(g));
    		for(int j=1;j<=m;++j)
    			for(int k=0;k<mo;++k) 
    				g[j]=max(g[j],f[k][j-1]+(s[i]-k+mo)%mo);
    		for(int j=1;j<=m;++j) f[s[i]][j]=max(f[s[i]][j],g[j]);
    	}
    	printf("%d
    ",f[s[n]][m]);
        return 0;
    }
    
  • 相关阅读:
    微信小程序开发入门(六)
    JS计算日期加上指定天数得到新的日期
    Java中substring()
    List集合去除重复数据
    按钮倒计时
    jQuery中each方法
    Math三个函数
    jQuery表单提交
    jQuery 序列化表单数据
    正则取小数点后面几位
  • 原文地址:https://www.cnblogs.com/void-f/p/8857965.html
Copyright © 2011-2022 走看看