zoukankan      html  css  js  c++  java
  • pku1014dividing(平分钻石,动态规划剪枝)

    352K 0MS G++ 1077B 2009-01-15 12:35:04

    判断给定的钻石价值能否均分。

    给一个bool数组它表示能分出的价值数<总价值的一半(如:总价值为8,且可分成3和5两份,那么f[3]=true)

    对于每个价值数(遍历a[1]到a[6])对于bool数组里面元素为真的下标,使其加上一个新给的价值,并赋予其值为真。

    如f[2]为真,表示可以分出价值2的一份钻石,这时另一份钻石里面还有价值为1的钻石(即a[1]!=0)

    那么f[3]=true(3=2+1)表示可以分出价值3的一份钻石。

    注意考虑的顺序,即循环的嵌套关系。。。。。。。。。。。

    优化:

    1.对于总价值为奇数的肯定不可以分。

    2.

    if(j+val*i>mid||f[j+val*i])
           break;

    前面:由于考虑的只有前mid项就可以,只要判断一份价值为mid的钻石能否分出,大于mid的判断不用。

    后面:

    假设现在flag[]的序列是这样的:1 1 0 1 1 0 1 1 0 1,当前考察的是 i=3array[i]=5,就是要在这个基础上加上53,按照程序的意思,从最后一个1开始依此加上3,将其值变为1,一共加上5个,然后在倒数第二个1上依此加上3,将其值变为1,一共加上5个,这个过程不会遇见flag=1的情况,给倒数第三个1依此加3的时候,会遇到:flag=1,这个时候就可以break了,因为这时候还需要加的43都在最后一个153时候加过了,这里要注意的是,给每个1加上3时候,只会遇到旧的”flag=1,不会遇到新增加的flag=1,而旧的1已经加过了array[i]i,所以就不用加了,直接退出就行了。---------------------【取自网上某位大牛的解题报告】

    这个剪枝很强大,如果不加的话,会时间超时。。。

     

    代码如下:

     

    Code
  • 相关阅读:
    Struts2获取参数的几种方式
    Struts2的Action中访问servletAPI方式
    struts2中常用配置
    struts2发送ajax的几个问题(不使用struts2-json-plugin的情况下)
    深入Struts2的过滤器FilterDispatcher--中文乱码及字符编码过滤器
    Ironic 裸金属实例的部署流程
    Ironic 裸金属管理服务的底层技术支撑
    Cinder AZ 与 Nova AZ 的同步问题
    OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题
    OpenStack 节点重启后无法联网的问题
  • 原文地址:https://www.cnblogs.com/pandy/p/1376297.html
Copyright © 2011-2022 走看看