Codeforces Round #210 (Div. 1)

来源:互联网 发布:贵州广电网络维修电话 编辑:程序博客网 时间:2024/06/09 23:39

http://codeforces.com/contest/360

A. Levko and Array Recovery
从后往前根据操作给每个位置赋值,然后还要从前往后判断操作是否可行。


B. Levko and Array

给你n个数,最多可以改变k个数,使得val = max( a(i), a(i+1) )尽量小,最小是多少。 n <= 2000


思路:首先考虑高复杂度的,设dp[i][j]表示 i 这个位置不变,前面已经改变了j个数最小的val值。那么 dp[i][j]可以由 dp[k][j-1] k < i转移过来,表示i位置不变k位置也不变中间的随意变,所以 dp[i][j] = min( dp[k][j-1] + i-j-1) ,每个转移是O(n)的,总复杂度是O(n^3)。 

二分答案X,复杂度就降低到了O(n^2logn)。。就done了


C. Levko and Strings

题意自己理解。。


思路: 设dp[i][j]表示i这个位置不等于s[i]的产生的值为j的情况数。

dp[i][j]一个转移是由前一个与原串字母不一样的转移过来的。则

如果上一个不一样的字母在cur这个位置,那么如果t[i] > s[i],可以产生 (n-i+1)*(i-cur)的值。

转移的复杂度是O(n*logn)的,可以自己好好想想。具体见代码