• 1114D . Flood Fill


    这道题还可以转化成最长回文串,实际的答案是 离散化后的数组最长回文串切成一半有几个数字,这些数字就是中间的数字需要对齐的对象,所以不用改变

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxN = 5008;
    
    int n;
    int dp[maxN][maxN];
    vector<int> a(1), b;
    vector<int> ans;
    
    void input() {
        cin >> n;
        for (int i = 0; i < n; i++) {
            int x; cin >> x;
            if (x != a.back()) a.push_back(x);
        }
        n = a.size() - 1;
    
        b = a;
        reverse(b.begin() + 1, b.end());
    }
    
    void solve() {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (a[i] == b[j]) {dp[i][j] = dp[i-1][j-1] + 1;}
                else {dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}
            }
        }
    }
    
    void output() {
        cout << n - (dp[n][n] + 1)/2 << '
    ';
    }
    
    int main() {
        
        input();
        solve();
        output();
        
        return 0;
    }
  • 相关阅读:
    JS 集合
    JS 字典
    JS 链表
    JS 队列
    JS 栈
    JS 列表
    JS 数组
    IOS 提示无法下载程式问题
    ubuntu 下安装Go开发环境
    菜鸟看Redis(一)
  • 原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10362537.html
Copyright © 2020-2023  润新知