【noi2009 管道取珠】动态规划、神奇

哎呀,这题太神奇了

设计状态想爆脑袋都想不到什么好的,感觉怎么搞都O了个状态总数,转移就更别谈了

一看题解,恍然大悟

哎呀。。

首先对 ans=sigma(a[i]^2)进行转化,将其这样理解:用AB分别表示一种取珠的方法,将结果相同的两种取珠方法(不管这两种取珠方法本身是否相同)记为(A, B),不难发现ans就是所有这样的(A, B)的对数。

  设状态f(a1, b1, a2, b2),如果f(a1, b1, a2, b2) = K,表示存在K对不完全相同的(A, B),使得A方法已经取出了第一个串的前a1个字符及第二个串的前b1个字符,B方法已经取出了第一个串的前a2个字符以及第二个串的前b2个字符,同时A方法与B方法得到的结果相同。

  显然,f(a1, b1, a2, b2)可以转移向4个方向:f(a1+1, b1, a2+1, b2)f(a1+1, b1, a2, b2+1)f(a1, b1+1, a2+1, b2)f(a1, b1+1, a2, b2+1),转移可行的前提是对应的字母相同。

  最后,f(n, m, n, m)就是问题的答案。递推初态是f(0, 0, 0, 0) = 1.

恩,没错,就是这样,就这么简单,可是就是没想到啊

回过头想想,本题中唯一能用的承受得起的表示状态的东西就只有 操作序列

而怎么用跟操作序列有关的状态求出ans就成了本题关键,将乘法化为加法,对应到两种操作序列上,平方运算自然消除,而且恰好造出了神奇算法

 

代码:

囧,这题想了好久。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值