简单dfs,差分一下A数组和建出字典树能写得更方便,若不这么做代码时就会像我一样难受。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll; const int N = 100003; int a[13][N], n, m, k, A[13], pos[13][N]; ll dfs(int tmp, int l, int r, int f) {
if (tmp > m) {
return 1ll * (r - l + 1) * A[m];
} int und = l;
ll ans = 1000000000000000ll;
if (r - l + 1 < k || (a[tmp][l] != 0) || (a[tmp][r] != k - 1)) {
ans = 1ll * A[tmp - 1] * (r - l + 1);
if (a[tmp][l] != 0) pos[tmp - 1][f] = 0;
if (a[tmp][r] != k - 1) pos[tmp - 1][f] = -(k - 1);
}
for (int i = l + 1; i <= r; ++i)
if (a[tmp][i] != a[tmp][i - 1] && a[tmp][i] != a[tmp][i - 1] + 1) {
ans = 1ll * A[tmp - 1] * (r - l + 1);
pos[tmp - 1][f] = -(a[tmp][i - 1] + 1);
break;
} for (int i = l + 1; i <= r + 1; ++i)
if (i > r || a[tmp][i] != a[tmp][und]) {
int num = dfs(tmp + 1, und, i - 1, und) + 1ll * A[tmp - 1] * (r - l + 1 - (i - und));
if (num < ans) {
ans = num;
pos[tmp - 1][f] = und;
} und = i;
}
return ans;
} char s[13]; int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= m; ++i) scanf("%d", &A[i]);
for (int i = 1; i <= n; ++i) {
scanf("%s", s + 1);
for (int j = 1; j <= m; ++j)
a[j][i] = s[j] - '0';
}
ll ans = dfs(1, 1, n, 1); int tmp = 1;
for (int i = 1; i <= m; ++i) {
tmp = pos[i - 1][tmp];
if (tmp <= 0) {
printf("%d", -tmp);
for (int j = i + 1; j <= m; ++j) putchar('0');
break;
}
printf("%d", a[i][tmp]);
}
printf("\n%lld\n", ans);
return 0;
}

最新文章

  1. redis集成到Springmvc中及使用实例
  2. dapper-dot-net用法及其扩展系列
  3. centos7 没有iptables服务 file or directory? 用secureCRT登录centos?
  4. position
  5. coreseek 中文搜索和高亮
  6. Python开发【第十七篇】:MySQL(一)
  7. IE中无法执行JS脚本 解决WINDOWS SERVER 2008弹出INTERNET EXPLORER增强安全配置正在阻止来自下列网站的内容
  8. Sql Server:不允许 ASSIGNMENT 语句中包含 FOR XML 子句
  9. VALGRIND
  10. c#中如何得到百分比数值
  11. Linq to SQL 类型的对象图包含循环,如果禁用引用跟踪,择无法对其进行序列化。
  12. merge into 语法缺陷
  13. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
  14. Spring搭建MVC WEB项目[转]
  15. 更改WebBrowser控件的用户代理
  16. 20190320 Dojo常用方法总结
  17. C#编程(四十一)----------用户定义的数据类型转换
  18. C++提供了四个转换运算符
  19. Scrum Meeting 10.28
  20. kickstart无人值守安装之实践篇

热门文章

  1. 线段树区间更新(set暴力)
  2. 文件读取 FILE
  3. Linux XOR.DDoS样本取证特征与清除
  4. 使用脚本实现killproc的功能
  5. github 优秀的开源项目
  6. 洛谷P2886牛继电器
  7. Hexo命令无法找到 -问题修复
  8. delphi 获取一个字符占用几个字节,方法
  9. ZooKeeper的典型应用场景
  10. SQL Server日期计算