题解 | #[CQOI2007]涂色PAINT# python简洁版

[CQOI2007]涂色PAINT

http://www.nowcoder.com/practice/512619bee5874e85bd2812a0c9066125

设置dp数组 dp[left][right] 表示将区间 [left, right] 染色的最少次数。由于可以将连续的区间一次性染完,所以如果 s[left] == s[right] 那么直接由子状态转移而来,否则就分成两段染色。

dp[left][right]=1,left==right,len==1dp[left][right]=min(dp[left+1][right],dp[left][right1]),if s[left]==s[right]dp[left][right]=min(dp[left][right],dp[left][mid]+dp[mid+1]) if s[left]!=s[right] and mid[left,right)dp[left][right] = 1, left == right, 即 len == 1 \\ dp[left][right] = min(dp[left + 1][right], dp[left][right - 1]), if \ s[left] == s[right] \\ dp[left][right] = min(dp[left][right], dp[left][mid] + dp[mid + 1]) \ if \ s[left] != s[right]\ and\ mid\in[left, right) 注意右边取不到

s = ' ' + input()
# 注意这里需要减一
n = len(s) - 1
dp = [[float("inf")] * (n + 1) for _ in range(n + 1)]

# 遍历所有的长度,注意状态转移方程是从中心开始的
for len in range(1, n + 1):
  	# 所有的左边起点
    for left in range(1, n - len + 2):
        right  = left + len - 1
        if len == 1:
            dp[left][right] = 1
            continue
        if s[left] == s[right]:
            dp[left][right] = min(dp[left + 1][right], dp[left][right - 1])
        else:
            for mid in range(left, right):
                dp[left][right] = min(dp[left][right], dp[left][mid] + dp[mid + 1][right])
print(dp[1][n])
全部评论

相关推荐

11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务