当前位置: 首页 > wzjs >正文

简述企业网站维护的重要性中国计算机网络公司排名

简述企业网站维护的重要性,中国计算机网络公司排名,免费做问卷的网站,百度图片搜索引擎入口D. Ball Sorting 题目: 思路: 思路想到了LIS,但是不知道怎么dp 我们先假设没有 k 的限制,即有无限个 0,那么此时的最优解是什么呢? 显然就是 n - len,其中 len 为LIS的长度,为什么…

D. Ball Sorting

题目:

思路:

思路想到了LIS,但是不知道怎么dp

我们先假设没有 k 的限制,即有无限个 0,那么此时的最优解是什么呢?

显然就是 n - len,其中 len 为LIS的长度,为什么呢?(以下的LIS代表递增子序列)

因为由于每次操作我们都可以将数插到任意位置,那么显然我们每一个数最多只需要移动一次即可到正确位置,那么如果有 k 这个限制呢?

首先从上面的结论我们可以知道,如果答案是 n - len,那么 0 的数量就得是 LIS 中间的断开区间的个数,什么意思呢?

我们举个例子,假设数组是 2 3 1 4 6 5,那么LIS就是 2 3 4 6 或 2 3 4 5,那么我们要将 1 5 放到正确位置的话就要 2 个 0(最少操作步数),如果只有 1 个 0 我们怎么分配呢?

 

我这里举例两种方式,一个是将整个区间重新排,一个是将 1 4 6 5 重新排(即绿色括号内的数)

那么答案就是绿色括号内区间的长度,这里的绿色括号就是 0 ,因为 0 可以排好任意一个区间内的所有数,所以我们显然是框选的数越少越好,那么做法就初见雏形

我们可以枚举每一个 k,即 0 的个数,然后考虑dp,那么如何dp呢?

我们可以定义 dp[i][j] 为有 i 个 0 时,LIS在 j 结尾时的最少操作数,那么如何转移呢?

首先一个显然的转移就是 dp[i][j] = dp[i-1][j],即直接从上一层转移过来

那么考虑另一个特殊情况,如果 a[i] > a[i-1] 那么 a[i] 就可以直接接在前面的 LIS 后面,且不会增加奉献,那么就有 dp[i][j] = min(dp[i][j],dp[i][j-1])

然后考虑暴力,由于我们不知道当前这个 j 当作哪个 LIS 的后面一个数奉献最少,所以直接暴力枚举前面每一种可能,我们从 0 ~ j - 1暴力寻找,如果有 a[j] > a[k] 说明我们的 j 可以当作 k 位置结尾的LIS的后一个数,如 2 3 后面可以接上 4,那么考虑奉献

如果我们选择接上去了,那么中间的数肯定都要被操作掉,如 2 3 (1) 4 ,其奉献就是 1,即LIS中间的数的个数,表示出来就是 j - k - 1,转移方程就是 dp[i][j] = min(dp[i][j], dp[i-1][k] + j - k - 1)

总结做法:考虑如何让操作最小,我们肯定是选择不需要动的数越多越好,那么就考虑LIS,对于一个LIS,由于 0 可以操作任意长度的区间,那我们考虑将 0 插入 LIS 的断开位置,那么奉献就是LIS所有断开区间的长度,显然可以考虑 dp 做法,因为我们不知道选哪个 LIS 最好

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define int long long
#define yes cout << "Yes\n"
#define no cout << "No\n"void solve()
{int n;cin >> n;vector<int> a(n+2);a[0] = 0, a[n + 1] = n + 1;for (int i = 1; i <= n; i++){cin >> a[i];}vector<vector<int>> dp(n + 1, vector<int>(n + 2, 1e18));//初始化一下 i = 0 时的情况,即看看不能跳时的最长LISdp[0][0] = 0;for (int i = 1; i <= n+1; i++){if (a[i] > a[i - 1])dp[0][i] = dp[0][i - 1];else break;}//枚举有 i 个 0 且LIS结尾在第 j 个数的最少操作数 for (int i = 1; i <= n; i++){for (int j = 1; j <= n+1; j++){//可以从上一个 i 转移过来dp[i][j] = dp[i - 1][j];//如果当前数可以直接连接前一个 LISif (a[j] > a[j-1]){//那就取 mindp[i][j] = min(dp[i][j], dp[i][j - 1]);}//枚举可以从哪个点拼接过来for (int k = 0; k < j; k++){//如果可以拼接,那么合并完后区间内的数就都要被操作if (a[j] > a[k]){//跳跃的奉献就是区间内的数的个数,即 j - k - 1,然后取mindp[i][j] = min(dp[i - 1][k] + j - k - 1, dp[i][j]);}}}cout << dp[i][n + 1] << " ";}cout << endl;
}signed main()
{cin.tie(0)->sync_with_stdio(false);int t = 1;cin >> t;while (t--){solve();}return 0;
}

http://www.dtcms.com/wzjs/792359.html

相关文章:

  • 网站建设销售主管岗位职责网站建设岗位主要做什么
  • 网站快照明天更新是什么情况中文商城响应式html网站模板
  • 湘潭学校网站建设 磐石网络第一wordpress插件地址
  • 开发网站有什么用论坛建立网站
  • 做公司网站需要花钱吗网站开发一般用什么语言
  • 德阳网站建设 选哪家好seo 网站文案模板
  • 福建手机版建站系统开发设计网站公司选泽y湖南岚鸿询 问
  • 自适应网站如何做mippy可以做网站吗
  • 合肥网站建设策划方案微网站建设微网站建设
  • 在百度上做购物网站app和网站开发区别
  • 网站建设与制作企业i排版 wordpress
  • 做网站需要多少钱啊北京王府井附近美食攻略
  • 东莞网站优化排名诊断济南网络公司工资排名
  • 站长工具alexa排名各类企业网站案例
  • wordpress注册协议网站排名优化seo
  • 网站做选择题怎么快速选择wordpress原生app
  • 仿制别人的网站违法吗女人与狗做网站
  • 钦州网站建开发一个网站的过程是什么
  • 团购网站 方案深圳能源集团股份有限公司
  • 个人网站建设主要功能手机网站底部导航
  • 个人网站服务器手机报价
  • 怎么做企业网站建设北京网站建设兴田德润放心
  • 做京挑客的网站影楼网站制作
  • 模板网站怎么建设优化扬州建设工程招聘信息网站
  • 做软测的网站制作游戏的app
  • 合肥哪家公司做网站杭州做商务网站
  • 论述网站建设及运营流程建设网站石家庄
  • 电脑可以做网站服务器吗wordpress 主域名
  • 自己怎么做直播网站吗刚开始做写手上什么网站
  • 大型网站开发基本流程备案网站名称注意事项