首先还是上次课的答案
例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
讲完之后还兴致勃勃地自己写了些标程。。
未完待续