0%

CF-1018-C. Wonderful City

思路讲解

唉,dp,你说没想到吧,也想到了一点,但没往下深想。

唉,主要想错了,这个行和列是相互独立的。

其实就是出现两者之间相差一的情况,那么这个比较小的列就无法加一了。

image

但其实上面这个说法不全面,导致我的算法设计有瑕疵,比如说下面这个例子

1
2
3
4
5
6
7
8
9
1
4
3 1 1 3 3 2 4 2
4 5 4 5 -> 4 6 -> 5 6
3 1 3 5 3 2 4 2
4 3 2 1 4 4 5 4
5 1 5 2
4 9 1 9

不难发现,上面这个例子还有可能传递,如第 nn 列需要 +1+1 但是和第 n1n-1 列相同了,所以第 n1n-1 列也需要 +1+1 ,但 n1n-1 列和第 n2n-2 列相同了……。

当然,上面说了这么多,其实意思只有一个,就是不能以需要操作的行和列为主体,而应该以所有列为主体,因为操作行和列的操作可能导致其他行和列也需要操作。

不过,我们也发现行和列能怎么操作也只和相邻的行和列相关,那么如果按顺序转移也是可以的。

状态定义如下所列。

1
2
3
// dpC[i][0] 表示保留第i列所需的最小花费
// dpC[i][1] 表示对第i列+1所需的最小花费
ll dpC[MAXN][2],dpR[MAXN][2];

转移只要确定是否合法其实就很简单了。

AC代码

https://codeforces.com/contest/2096/submission/318683142

心路历程(WA,TLE,MLE……)