题解 | #jzgg,云哥,沙烬巨巨为什么这么强#

jzgg,云哥,沙烬巨巨为什么这么强

https://ac.nowcoder.com/acm/contest/17561/G

这个题读明白了就会发现就是lis预处理一下然后进行区间dp的板子题

//标程
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1110;
const int INF = 0x3f; //初始化的最大值
long long sum[maxn];
long long a[maxn];
long long dp[maxn][maxn];

long long LIS(string s) {
    long long lis[maxn] = {0};
    long long ans = 0;
    long long len = s.size();
    for(int i = 0; i < len; i++)
        lis[i] = 1;
    for (int i = 1; i <= len; i++)
        for (int j = 0; j < i; j++)
            if (s[j] < s[i])
                lis[i] = max(lis[i], lis[j] + 1);
    for (int i = 0; i < len; i++)
        ans = max(ans, lis[i]);
    return (ans * len * int(s[0]));
}

int main(void) {
    int n;
    cin >> n;
    memset(dp, INF, sizeof dp);
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        a[i] = LIS(s);
        sum[i] = sum[i - 1] + a[i];
        dp[i][i] = 0;
    }
    for (int len = 2; len <= n; len++) {
        for (int i = 1, j = len; j <= n; i++, j++) {
            for (int k = i; k < j; k++) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
            }
        }
    }
    cout << dp[1][n] << endl;
    return 0;
}
全部评论
真的十分抱歉 我再此谢罪 G题的的数据出锅了 因此一些使用优先队列的算法把题目过了 是我的错 真的十分抱歉,数据已经补上了,真的十分抱歉。
点赞 回复 分享
发布于 2021-06-28 00:52

相关推荐

点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务