SHTSC记 13.10.06

来源:互联网 发布:网络上有重名怎么办 编辑:程序博客网 时间:2024/06/06 09:38

首先还是上次课的答案

例1 设d(i,j)为从i到j的答案,所求即为d(0,n-1)转移是这样的

i>=j 0

s[i]==s[j] 则为d(i+1,j-1)

s[i]!=s[j] min(d(i,j-1),d(i+1,j))+1

这题基本属于会的秒杀,不会的肯定做不出


例2 T37

设f(i,j)为这个区间先手拿的最大值,所求即为f(1,n)

f(i,j)=max(a[i]+g(i+1,j),a[j]+g(i,j-1))

g(p,q)为这个区间后手拿的最大值

g(i,j)=s[j]-s[i-1]-f(i,j)

f(i,j)=max(s[j]-s[i]-f(i+1,j)+a[i],s[j-1]-s[i-1]-f(i,j-1)+a[j])

=max( s[j]-s[i-1]-f(i+1,j) , s[j]-s[i-1]-f(i,j-1) )

=s[j]-s[i-1] -min(f(i,j-1),f(i+1,j))

边界:f(i,i)=a[i]

例3 石子合并

线形版


法1 f(i,j)为区间答案 f(i,j)=min( f(i,k) + f(k+1,j) )  i<=k<j  +a[i]+...+a[j]

法2 f(i,l)为i为起点l为长度的答案,f(i,l)=min ( f(i,k)+ f(k+i,l-k) ) 1<=k<l + a[i]+..a[i+l-1]

环状版


法1就比较麻烦了,要写两遍数组?

法2 f(i,l)=min ( f(i,k) + f( (k+i-1) % n +1 ,l-k) ) 1<=k<l  +a[i]+..+a[l+i-1] (具体实现应该要讨论)

例4 T39


32^100000 mod 71

由 费马小定理 32^70 =1 mod 71

原式=32^40 mod 71

=2^200 mod 71

=2^60 mod 71

=2^ -10 mod 71

=1024 ^-1 mod 71

=30 在mod71下的逆

即求 30*ans=1 mod 71

30*ans + 71 * y=1

exgcd即可


10月6号貌似马融没迟到,不过上中的神犇们都没来(学校补课?)

余爷爷还问我:你是上中的?我。。。

讲的背包问题

例1 给出一个集合S求所有的子集和

用的是P的布尔数组,应该有点慢吧,自己用了set试试,搞了半天搞不出。。


例2 01背包

直接上滚动数组,还说他认为这个好理解。。

然后介绍的二维数组解法


例3 T44

自己曾做过,效率极低但还是过了,用背包问题来解效率高了很多 //USACO能不能控制下打表的问题

例4 T45


例5 T46


例6 T47


例7 T28


讲完之后还兴致勃勃地自己写了些标程。。


未完待续

原创粉丝点击