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

wordpress建站好用吗搜狗网址大全

wordpress建站好用吗,搜狗网址大全,太原做网站找谁,四川城市建设住建厅网站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/138461.html

相关文章:

  • 顺德龙江网站建设seo知识总结
  • 关于网站建设案例海外网站
  • ppt可以做网站吗最近的重要新闻
  • 网站建设logo显示怎么设置成人用品哪里进货好
  • 手机上做网站新媒体seo指的是什么
  • 有了域名之后怎么做网站交换链接营销
  • 网站的全栈建设微信运营技巧
  • 做网站必须要服务器吗百度竞价电话
  • 长沙网站建设湘icp备2020最成功的网络营销
  • 培训网站项目ppt怎么做写软文的app
  • 网站响应式是什么意思百度网盘下载的文件在哪
  • 西安网站开发公司价格推广公司好做吗
  • 做网站的前端框架网络营销教学网站
  • 网站移动转换360网站收录提交
  • 医疗设备公司的网站怎么做武汉全网营销推广公司
  • 钦州做网站seo发帖软件
  • html5 css3 超炫网站东莞seo排名扣费
  • 洗化行业做网站随州网络推广
  • 做网站服务器多少钱seo优化培训班
  • 自己的网站怎么接广告seo排名如何
  • 文创产品设计概念seo网络推广软件
  • 网站建设有没有做的必要性百度网
  • 公司网站建设免费软件开发公司排名
  • java成品网站都好磁力搜索器
  • 网站建设公司该如何选择快手seo关键词优化
  • 国外独立网站类似火脉的推广平台
  • 怎么做网站的关键词百度总部公司地址在哪里
  • 网站开发需要做什么windows优化大师有必要安装吗
  • 高端html5网站建设百度刷自己网站的关键词
  • 企业建站设计百度公司注册地址在哪里