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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 4.24 区间DP+思维题 -> 正文阅读

[数据结构与算法]4.24 区间DP+思维题

区间DP,复习一下
石子合并
最经典的题了

#include <bits/stdc++.h>
using namespace std;
#define imax 0x7fffffff
const int N=500;
int dp[N][N];
int a[N];
int sum[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
    }
    for(int len=1;len<=n;len++)
    {
        for(int l=1;l<=n;l++)
        {
            int r=len+l;
            if(r>n)
                break;
            dp[l][r]=imax;
            for(int k=l;k<=r;k++)
            {
                dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+sum[r]-sum[l-1]);
            }
        }
    }
    cout<<dp[1][n]<<endl;
    return 0;
}

注意的点主要有三个
1.边界的控制
2.初始化
3.特殊条件

比如这个题就是
CF607B Zuma

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[500+10][500+10];
int a[500+10];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        dp[i][j]=1e9;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        dp[i][i]=1;
    }
    for(int i=1;i<n;i++)
        dp[i][i+1]=1+(a[i]!=a[i+1]);
    for(int i=1;i<=n;i++)
    {
        for(int l=1;l<=n;l++)
        {
            int r=l+i-1;
            if(r>n)
                break;
            if(a[l]==a[r])
            {
                dp[l][r]=min(dp[l][r],dp[l+1][r-1]);
            }
            for(int k=l;k<=r;k++)
            {
                dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
            }
        }
    }
    cout<<dp[1][n]<<endl;
    return 0;
}

思维题
D. Insert a Progression
题意:给定初始数组a,和一个含有x个元素的排列,要求把排列插入数组中并且让插入之后的数组的相邻项的差的绝对值之和最小。

分析
1.发现1 3 7和1 7的相邻项的差的绝对值之和相等均是6,所以应当尽可能的少造成波峰和波谷
2.根据观察,发现在中间的波峰或者波谷对于答案的贡献比两边的大,中间的会贡献两倍的差值
3.在观察发现,1 3 7这样数组,把3替换了之后新增的差值是替换值和3的差值的两倍
4.根据以上三条可以确定贪心思路

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N =2e5+100;
int a[N];
signed main()
{
   int t;
   for(cin>>t;t;t--)
   {
       int f,l;
       int n,x;
       cin>>n>>x;
       for(int i=1;i<=n;i++)
           cin>>a[i];
       int ans=0;
       f=min(a[1]-1,a[n]-1);
       l=min(x-a[1],x-a[n]);
       for(int i=1;i<=n;i++)
       {
           f=min(f,2*(a[i]-1));
           l=min(l,2*(x-a[i]));
           if(i>1)
           ans+=abs(a[i]-a[i-1]);
       }
       f=max(f,0ll);
       l=max(l,0ll);
       ans+=f+l;
       cout<<ans<<endl;
   }
    return 0;
}

待思考:这样不会选到同一个元素吗,,选到了真的合法吗,为什么

C. Make it Increasing

题意:给定初始数组b全为0,和一个数组a,用a数组每次可以让bi,加ai或者减ai,问:构造一个严格递增的数组b最少要几次操作

思路:枚举每一个点作为0的情况

我真的没想出来这个狗思路,什么啊这

看不懂自己跟着模拟一下

#include <bits/stdc++.h>
#define int long long
using namespace std;
long long n,a[5005],ans=1e18;
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        int pre=0,sum=0;
        for(int j=i+1;j<=n;j++)
        {
            sum+=pre/a[j]+1;
            pre=(pre/a[j]+1)*a[j];
        }
        pre=0;
        for(int j=i-1;j>=1;j--)
        {
            sum+=pre/a[j]+1;
            pre=(pre/a[j]+1)*a[j];
        }
        ans=min(ans,sum);
    }
    cout<<ans<<endl;
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:01:52  更:2022-04-26 12:06:47 
 
开发: 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 7:22:12-

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