zoukankan      html  css  js  c++  java
  • 能量项链

    Description

    在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为(Mars单位),新产生的珠子的头标记为m,尾标记为n。

    需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。

    Analysis

    和加分二叉树还挺像,明显的区间动规。对于i到j颗能量珠,要将ik与k+1j区间想融合,由题意得,明显的最优解子结构,自然要使区间融合的结果最大才行。所以dp[i][j]=max(dp[i][k]+dp[k+1][j]+l[i]r[j]r[k]),又因为项链是一个环,所以要循环n次头结点取出最大值。

    Code

    #include <bits/stdc++.h>
    
    int n,l[201],r[201],dp[201][201],ans;
    
    void treat(int begin){
    	memset(dp,0,sizeof(dp));
    	for(int len=2;len<=n;len++)
    		for(int b=begin;b<=begin+n-len;b++)
    			for(int i=b;i<b+len-1;i++){
    				int e=b+len-1;
    				dp[b][e]=std::max(dp[b][e],dp[b][i]+dp[i+1][e]+l[b]*r[e]*r[i]);
    			}
    	ans=std::max(ans,dp[begin][begin+n-1]);
    }
    
    int main(){
    	freopen("energy.in","r",stdin);
    	freopen("energy.ans","w",stdout);
    	std::cin>>n;
    	for(int i=1;i<=n;i++){
    		std::cin>>l[i];
    		l[i+n]=r[i-1+n]=r[i-1]=l[i];
    	}
    	r[n]=l[1];
    	for(int i=1;i<=n;i++)
    		treat(i);
    	std::cout<<ans<<std::endl;
    	return 0;
    }
    
    
  • 相关阅读:
    AngularJS Insert Update Delete Using PHP MySQL
    Simple task manager application using AngularJS PHP MySQL
    AngularJS MySQL and Bootstrap Shopping List Tutorial
    Starting out with Node.js and AngularJS
    AngularJS CRUD Example with PHP, MySQL and Material Design
    How to install KVM on Fedora 22
    Fake_AP模式下的Easy-Creds浅析
    河南公务员写古文辞职信
    AI
    政协委员:最大愿望是让小学生步行上学
  • 原文地址:https://www.cnblogs.com/qswx/p/9492500.html
Copyright © 2011-2022 走看看