• BZOJ4247 挂饰


    BZOJ4247 挂饰

    题目传送门

    题解

    一个比较简单的(Dp),我们可以发现挂饰的总个数只有2000个,所以如果挂钩的个数超过了2000个,就没有意义去记录了。所以我们记(f[i])表示当前挂钩为(i)个的时候能够到达的最大的贡献是多少。然后将挂饰按挂钩个数从大到小排序,进行(Dp)即可。

    code

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    bool Finish_read;
    template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
    template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
    template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('
    ');}
    template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
    /*================Header Template==============*/
    const int maxn=2005;
    const int inf=2e9+500;
    int n;
    struct vol {
    	int a,b;
    	bool operator < (const vol &rhs) const {
    		return a>rhs.a;
    	}
    }v[maxn];
    int f[maxn];
    int ans=0;
    /*==================Define Area================*/
    int main() {
    	read(n);
    	for(int i=1;i<=n;i++) {
    		read(v[i].a);read(v[i].b);
    		v[i].a--;
    	}
    	sort(v+1,v+1+n);
    	for(int i=0;i<=n;i++) f[i]=-inf;
    	f[0]=f[1]=0;
    	for(int i=1;i<=n;i++) {
            if(~v[i].a) {
            	for(int j=n;j;j--) f[min(j+v[i].a,n)]=max(f[min(j+v[i].a,n)],f[j]+v[i].b);
            }        
        	else {
        		for(int j=1;j<=n;j++) f[j-1]=max(f[j-1],f[j]+v[i].b);
        	}
            for(int j=0;j<=n;j++) ans=max(ans,f[j]);
        }
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
    「我不敢下苦功琢磨自己,怕终于知道自己并非珠玉;然而心中既存着一丝希冀,便又不肯甘心与瓦砾为伍。」
  • 相关阅读:
    我对软件工程的理解
    性能分析优化的道与术
    如何进行项目管理?
    如何进行项目管理?
    软件工程基础知识总结
    我经历过的监控系统演进史
    我对软件工程的理解
    10.14:线上直播问题汇总答疑
    软件工程基础知识总结
    如何进行需求分析?
  • 原文地址:https://www.cnblogs.com/Apocrypha/p/9431697.html
Copyright © 2020-2023  润新知