IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> CF1675 G. Sorting Pancakes (DP) -> 正文阅读

[数据结构与算法]CF1675 G. Sorting Pancakes (DP)

题目链接

题意

给定一个长度为 n n n的数组 a a a,以及数组 a a a的所有元素之和 m = ∑ i = 1 n a i m=\sum_{i=1}^na_i m=i=1n?ai?

现在要用最小的操作数将数组 a a a变为一个非递增数组 b b b,即满足: b 1 ≥ b 2 ≥ . . . ≥ b n b_1\ge b_2\ge...\ge b_n b1?b2?...bn?

每次可以选择下面两个操作之一:

  1. 如果 i > 1 i>1 i>1,可以将 a [ i ] a[i] a[i]的值减1,同时将 a [ i ? 1 ] a[i-1] a[i?1]的值加1.
  2. 如果 i < n i<n i<n,可以将 a [ i ] a[i] a[i]的值减1,同时将 a [ i + 1 ] a[i+1] a[i+1]的值加1.

思路

如果我们已经得到了移动后的数组 b b b,那么最小操作数可以通过数组 a a a的前缀和 O ( n ) O(n) O(n)算出来。

定义前缀和 p r e a [ i ] = ∑ j = 1 i a [ j ] pre_a[i]=\sum_{j=1}^ia[j] prea?[i]=j=1i?a[j] p r e b [ i ] = ∑ j = 1 i b [ j ] pre_b[i]=\sum_{j=1}^ib[j] preb?[i]=j=1i?b[j]:则最小操作数为: ∑ i = 1 n ∣ p r e a [ i ] ? p r e b [ i ] ∣ \sum_{i=1}^n|pre_a[i]-pre_b[i]| i=1n?prea?[i]?preb?[i]

解释:

for(int i = 1; i <= n; i++) {
	res += abs(a[i] - b[i]);
	a[i + 1] += a[i] - b[i];
}

下 标 1 的 贡 献 : ∣ a [ 1 ] ? b [ 1 ] ∣ ∣ p r e a [ 1 ] ? p r e b [ 1 ] ∣ 下 标 2 的 贡 献 : ∣ ( a [ 2 ] + a [ 1 ] ? b [ 1 ] ) ? b [ 2 ] ∣ ∣ p r e a [ 2 ] ? p r e b [ 2 ] ∣ 下 标 3 的 贡 献 : ∣ a [ 3 ] + ( a [ 2 ] + a [ 1 ] ? b [ 1 ] ? b [ 2 ] ) ? b [ 3 ] ∣ ∣ p r e a [ 3 ] ? p r e b [ 3 ] ∣ ? 下 标 n 的 贡 献 : ? ∣ p r e a [ n ] ? p r e b [ n ] ∣ \begin{matrix} 下标1的贡献:&|a[1] - b[1]| & |pre_a[1]-pre_b[1]| \\ 下标2的贡献:&|(a[2] + a[1] - b[1]) - b[2]| & |pre_a[2]-pre_b[2]| \\ 下标3的贡献:&|a[3]+(a[2] + a[1] - b[1]-b[2]) - b[3]| & |pre_a[3]-pre_b[3]| \\ \cdots \\ \\ 下标n的贡献:&\cdots & |pre_a[n]-pre_b[n]| \\ \end{matrix} 1:2:3:?n:?a[1]?b[1](a[2]+a[1]?b[1])?b[2]a[3]+(a[2]+a[1]?b[1]?b[2])?b[3]??prea?[1]?preb?[1]prea?[2]?preb?[2]prea?[3]?preb?[3]prea?[n]?preb?[n]?

定义 d p [ i ] [ j ] [ x ] dp[i][j][x] dp[i][j][x] p r e b [ i ] = j pre_b[i]=j preb?[i]=j并且 b [ i ] = x b[i]=x b[i]=x时需要的最少操作数,那么转移方程为:
{ d p [ i ] [ x ] [ x ] = ∣ p r e a [ 1 ] ? x ∣ , i = 1 d p [ i ] [ j ] [ x ] = min ? k ≥ x { d p [ i ? 1 ] [ j ? x ] [ k ] } + ∣ p r e a [ i ] ? j ∣ , i > 1 \left\{ \begin{matrix} dp[i][x][x] &=& |pre_a[1] - x| &, i=1 \\ \\ dp[i][j][x] &=& \min_{k\ge x} \{dp[i - 1][j - x][k]\} + |pre_a[i] - j| &, i>1 \end{matrix} \right. ????dp[i][x][x]dp[i][j][x]?==?prea?[1]?xminkx?{dp[i?1][j?x][k]}+prea?[i]?j?,i=1,i>1?

看上去好像是 O ( n 4 ) O(n^4) O(n4),但是算上减枝的话,跑的还挺快的。

#include <bits/stdc++.h>
using namespace std;

const int N = 250 + 10;
int n, m, dp[N][N][N];
int a[N], pre[N];

int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin.exceptions(ios::badbit | ios::failbit);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) pre[i] = pre[i - 1] + a[i];
    memset(dp, 0x3f, sizeof dp);

    for (int i = 0; i <= m; i++) dp[1][i][i] = abs(pre[1] - i);

    for (int i = 2; i <= n; i++)
        for (int x = 0; x <= m; x++)
            for (int k = x; k <= m; k++)
                for (int j = x + k; j <= m; j++)
                    dp[i][j][x] =
                        min(dp[i][j][x], dp[i - 1][j - x][k] + abs(pre[i] - j));

    int res = 1e9;
    for (int x = 0; x <= m; x++) res = min(res, dp[n][m][x]);
    cout << res;
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:39:00  更:2022-05-11 16:42:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:22:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码