博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Timetable CodeForces - 946D (预处理+背包)
阅读量:4348 次
发布时间:2019-06-07

本文共 1467 字,大约阅读时间需要 4 分钟。

题意:n天m节课,最多可以逃k节课,每天在学校待的时间为该天上的第一节课到最后一节课持续的时间。问怎样逃课可以使这n天在学校待的时间最短,输出最短的时间。

分析:

1、预处理出每天逃j节课时在学校待的最短时间。t[i][j]

2、dp[i][j]为截止到第i天逃j节课待在学校的最短时间。

#include
using namespace std;const int MAXN = 500 + 10;const int INF = 0x3f3f3f3f;char pic[MAXN][MAXN];vector
v[MAXN];int t[MAXN][MAXN];int dp[MAXN][MAXN];int main(){ int n, m, k; scanf("%d%d%d", &n, &m, &k); for(int i = 1; i <= n; ++i){ scanf("%s", pic[i]); } for(int i = 1; i <= n; ++i){ for(int j = 0; j < m; ++j){ if(pic[i][j] == '1'){ v[i].push_back(j); } } } for(int i = 1; i <= n; ++i){ int len = v[i].size(); int mi = min(len, k); for(int j = 0; j <= mi; ++j){//逃课数 int rest = len - j; if(rest == 0){//今天不用上课 t[i][j] = 0; continue; } int Mi = INF; for(int w = 0; w < len; ++w){ int et = w + rest - 1; if(et >= len) break; Mi = min(Mi, v[i][et] - v[i][w] + 1); } t[i][j] = Mi; } } for(int i = 1; i <= n; ++i){ for(int j = 0; j <= k; ++j){ dp[i][j] = INF; for(int w = 0; w <= j; ++w){ dp[i][j] = min(dp[i][j], dp[i - 1][w] + t[i][j - w]); } } } printf("%d\n", dp[n][k]); return 0;}

  

转载于:https://www.cnblogs.com/tyty-Somnuspoppy/p/8542262.html

你可能感兴趣的文章
大型Web应用运行时 PHP负载均衡指南
查看>>
为phpStorm 配置PHP_CodeSniffer自动检查代码
查看>>
测试工具网址大全(转)
查看>>
ServiceStack DotNet Core前期准备
查看>>
webpack中‘vant’全局引入和按需引入【vue-cli】
查看>>
Date、String和Timestamp类型转换
查看>>
计算机的组成
查看>>
CSS命名规范
查看>>
初始化构造函数中定义的实体集合,方便嵌套类型的遍历
查看>>
状压dpHDU - 4856
查看>>
java.nio.ByteBuffer 类 缓冲区
查看>>
PL/SQL系列1-PL/SQL介绍
查看>>
关于render函数的总结
查看>>
JavaScript 小刮号
查看>>
BZOJ USACO 银组 水题集锦
查看>>
Android为TV端助力 Linux命令查看包名类名
查看>>
【zabbix】自动注册,实现自动发现agent并添加监控(agent不需要任何配置)
查看>>
[简单到爆]eclipse-jee-neon的下载和安装
查看>>
vector
查看>>
Redis学习之set类型总结
查看>>