C. Barcode dp
2024-09-07 13:48:25
https://codeforces.com/problemset/problem/225/C
这个题目和之前一个题目很像 https://www.cnblogs.com/EchoZQN/p/10900373.html
只是这个数据范围更大一些,
不过刚开始我真的没有看出来。。。。
这个就是整列整列的处理,所以还是一样枚举当前的连续的j
dp[i][j][k] 这个k只有两个取值,一个是0,一个是1,0 代表白色,1代表黑色。
这个定义就是dp[i][j][0] 前面i个连续j个白色的列需要粉刷的最少的砖的数量。
另外一个同样,
所以按照之前的想法,很贱的就可以知道会有两种情况,一个是j==1 那就说明是之前的情况推过来的,因为之前的这个j不确定,
所以这里要枚举每一种情况。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
#define debug(x) cout<<"-----"<<" x = "<<x<<"-----"<<endl
using namespace std;
typedef long long ll;
const int maxn = 5e3 + ;
ll dp[][][];
char s[][];
int b[], w[];
int main()
{
int n, m, x, y;
scanf("%d%d%d%d", &n, &m, &x, &y);
for (int i = ; i <= n; i++) scanf("%s", s[i] + );
for(int j=;j<=m;j++)
{
for(int i=;i<=n;i++)
{
if (s[i][j] == '.') w[j]++;
else b[j]++;
}
}
memset(dp, inf, sizeof(dp));
dp[][][] = b[];
dp[][][] = w[];
for(int i=;i<=m;i++)
{
for(int j=;j<=y&&j<=i;j++)
{
if(j!=)
{
dp[i][j][] = dp[i-][j-][] + b[i];
dp[i][j][] = dp[i-][j-][] + w[i];
}
else
{
for(int k=x;k<=y;k++)
{
dp[i][j][] = min(dp[i][j][], dp[i-][k][] + b[i]);
dp[i][j][] = min(dp[i][j][], dp[i-][k][] + w[i]);
}
}
// printf("dp[%d][%d][0]=%lld\n", i, j, dp[i][j][0]);
// printf("dp[%d][%d][1]=%lld\n", i, j, dp[i][j][1]);
}
}
ll ans = inf;
for(int i=x;i<=y;i++)
{
ans = min(ans, dp[m][i][]);
ans = min(ans, dp[m][i][]);
}
printf("%lld\n", ans);
return ;
}
最新文章
- [Asp.net 5] Caching-缓存架构与源码分析
- button 样式
- selenium处理select标签的下拉框
- struts2总结一:MVC设计模式
- java多线程学习-同步之线程通信
- 初始html5,遇到的第一个问题
- 一网打尽当下NoSQL类型、适用场景及使用公司
- HDU 2176 (Nim博弈 先手取胜方案) 取(m堆)石子游戏
- socket编程在windows和linux下的区别
- php学习笔记——表单
- SD卡的SPI模式的初始化顺序(转)
- backbone入门学习一
- c语言int型和char型的自动类型转换
- About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。
- 树莓派0 ubuntu无显示器ssh登录终端
- JVM 虚拟机笔记
- [转]python3字符串与文本处理
- 自动化测试-21.RobotFrameWork配置安装
- 重置AD用户密码
- Java http协议概述