题意:在高度为 2,长度为 n 的字符矩阵中, '.' 代表空,'*' 代表一个点。一次移动可以使一个点移动到相邻位置中,当移动到的位置中原来就有一个点时,那么原来那个点消失。问最小多少次移动使矩阵中只剩一个点。

思路:先把开头和结尾上下两行都是空白的列删除,然后用动态规划的方法,状态表示:用 dp[ i ][ j ] 表示第 i 列以前(包括第 i 列)所有的点移动到位置(i,j)的最小操作次数。状态计算:第一行dp[i][0] = min(dp[i][0], min(dp[i - 1][0] + 1 + cost[i][1], dp[i - 1][1] + 2));  第二行 dp[i][1] = min(dp[i][1], min(dp[i - 1][1] + 1 + cost[i][0], dp[i - 1][0] + 2));

代码:

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5 + 10, P = 1e9 + 7, mod = 998244353;
int cost[N][2];
int dp[N][2];
void solve(){int n;string s[2];cin >> n >> s[0] >> s[1];for(int i = 0; i < 2; i++){while(s[0].back() == '.' && s[1].back() == '.')s[0].pop_back(), s[1].pop_back();reverse(s[0].begin(), s[0].end()); reverse(s[1].begin(), s[1].end()); } n = s[0].size();for(int i = 0; i < n; i++)for(int j = 0; j < 2; j++)cost[i][j] = s[j][i] == '*', dp[i][j] = 0x3f3f3f3f;dp[0][0] = cost[0][1];dp[0][1] = cost[0][0];for(int i = 1; i < n; i++){dp[i][0] = min(dp[i][0], min(dp[i - 1][0] + 1 + cost[i][1], dp[i - 1][1] + 2));dp[i][1] = min(dp[i][1], min(dp[i - 1][1] + 1 + cost[i][0], dp[i - 1][0] + 2));}cout << min(dp[n - 1][0], dp[n - 1][1]) << endl;
}
int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int t;cin >> t;while(t--) {solve();}return 0;
}

CF 1680 E. Moving Chips dp 2000相关推荐

  1. Educational Codeforces Round 128 (Rated for Div. 2) E. Moving Chips(玄学)

    Educational Codeforces Round 128 (Rated for Div. 2) E. Moving Chips(玄学) 链接 题意:给一个2∗n2*n2∗n的∗.*.∗.矩阵, ...

  2. CF#764(div.3A~D)dp进阶

    CF#764(div.3A~D)&&dp进阶 CF#764(div.3) Problem - A - Codeforces 题意 一个数列,每次操作可以使这个数列中的任何数加1,问最少 ...

  3. CF:E. Moving Chips【二维双dp + dp灵活交叉】

    分析 记录*第一次出现的列l和最后出现的列r 然后dp1表示汇聚到当前列的上行的cost dp2表示汇聚到当前列的下行的cost 初始化的话 dp1就是在第L列汇聚到上行的cost,显然如果下行有的话 ...

  4. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  5. CF 55D Beautiful numbers 数位DP

    思路: 要找一个数能被他的所有反的数字整除,只需求出这个数能被其数字的LCM整除.而LCM最大为5*7*8*9=2520: 如果直接开dp[20][2520][2520]会超内存,而2^3,3^2,5 ...

  6. CF 1696 E. Placing Jinas 组合数 2000

    题意:有一个长度为 n + 1 的非递增数组 a,在二维平面中,对于任意正整数 x,y 当 x < ay(y > n 时 ay = 0)时 x,y 为白色方格,最初在(0,0)有一个玩偶, ...

  7. CF 711C Coloring Trees(三维dp)

    原题地址: https://codeforces.com/problemset/problem/711/C 题意:有nnn棵树,mmm种颜色,让你分成kkk段,数字000代表该树没没有进行染色,需要你 ...

  8. CF 1625C. Road Optimization(DP)

    Linking 题意: 在一条直线道路从A到走向B点,A点位于0位置,B点位于m位置. 道路上有n个时速牌,第i个牌上标有ai,表示从该时速牌到下一时速牌这段距离中,每走一个位置耗时ai分钟.(初始位 ...

  9. CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]

    C - Circling Round Treasures 题意: 在一个$n*m$的地图上,有一些障碍,还有a个宝箱和b个炸弹.你从(sx,sy)出发,走四连通的格子.你需要走一条闭合的路径,可以自交 ...

最新文章

  1. org.springframework.data.redis 一次连接获取特定key所有k-v(pipeline)
  2. Rokid webhook 指南 手把手教你做个懒人
  3. 指针 混用 迭代器_对比 C++ 和 Python,谈谈指针与引用
  4. pytorch 中 logsoftmax 与 softmax的区别
  5. hbase-site.xml 和 hbase-default.xml
  6. ubuntu安装USB转串口驱动(PL2303)
  7. mysql 最小配置_如何配置全世界最小的 MySQL 服务器
  8. python图像增强_Python图像的增强处理操作示例【基于ImageEnhance类】
  9. vmware linux ens32,修改Centos7的网卡ens32 改为eth0
  10. js延时函数_js自执行函数分享
  11. ML、DL、CNN学习记录7
  12. 音乐 美术 计算机期末考试表,2021东莞中考音乐美术信息技术合格性考试时间安排...
  13. 敏捷开发免费管理工具——火星人预览之五:常见问题问答
  14. 什么是win10嵌入式安装Linux,Windows10自带Linux系统(WSL)安装过程
  15. SpannableString 给TextView添加不同的显示样式
  16. Node.js:Webpack
  17. 【Gym-100889 H】Hitting Points【凸包三分】
  18. 百度地图 - js获取行政区边界范围
  19. 世界主要国家货币名称列表整理[外贸免费工具]
  20. 4、混合、股票型基金

热门文章

  1. 学习Redis的正确姿势,有这一篇就够了
  2. eclipse中文显示乱码解决方法总结
  3. [深度学习] OpenVINO开发:Win 10 安装及卸载
  4. ubuntu WPS 报错系统缺失字体symbol、wingdings、wingdings 2、wingdings 3
  5. 最好听的钢琴曲排行榜 世界上最好听的钢琴曲
  6. 下载anaconda前需要卸载python吗_装了anaconda要卸载python吗
  7. 当你的才华还撑不起你的野心的时候,那就静下心来学习吧!
  8. SOPHP免费稳定的微信公众号开源框架
  9. C++使用winhttp以POST/GET方法实现报文转发与接收
  10. 短信发送平台-阿里大于