链接:CF 273D
大意:给你一个n*m的矩阵,让你在上面画一个凸的图形,问有多少种这样的图形。
思路:n和m都是150的n4n^4n4就是5e8了不太现实,猜测复杂度是n3n^3n3的。这题初看比较复杂,其实想想要画这样一个图形,从上往下画的话,只需要保证两边都是一个单峰序列就可以了(当然可以有相等的),所以考虑设计dp状态,dp[i][j][k][l][[z]dp[i][j][k][l][[z]dp[i][j][k][l][[z] 表示画到第iii行,当前行画了j到kj到kj到k这些格子,左边序列的状态是lll,右边序列的状态是zzz的情况下的画法有多少种(lll和zzz表示当前是增还是不增,显然没必要分为增、降、和持平三种,两种就够了)。
 OK现在来考虑初始化和转移。初始化要处理一下从当前行才开始画的情况,把所有的状态为0的线段情况数设为1就行了。转移在状态设计出来的情况下就比较显然了,就分别对两边的状态做一个判断然后直接加上所有符合条件的和就行了。
 显然转移是可以做到O(1)的,预处理一下前缀和就好了,dpdpdp数组的第一维可以滚动,但没必要。
 写着写着发现状态开两维没有必要也稍稍麻烦一点,所以把两维合成一维了。还是有点细节的,写的时候得细心点。感觉写的不太优美,但是这样写比较无脑,而且能过就行啦。
AC Code:

void add(int &x, int y){x += y;if(x >= mod) x -= mod;
}int dp[151][151][151][4];
int sum[151][151][4];
int n, m;int getsum(int x1, int y1, int x2, int y2, int l){int ret = sum[x2][y2][l] + sum[x1-1][y1-1][l] - sum[x1-1][y2][l] - sum[x2][y1-1][l];while(ret < 0) ret += mod;while(ret >= mod) ret -= mod;return ret;
}int main()
{scanf("%d %d", &n, &m);int ans = 0;rep(i, 1, n){rep(l, 1, m) rep(r, l, m) dp[i][l][r][0] = 1;rep(l, 1, m){rep(r, l, m){add(dp[i][l][r][0], getsum(l, l, r, r, 0));//rep(j, l, r) rep(k, j, r) add(dp[i][l][r][0], dp[i-1][j][k][0]);add(dp[i][l][r][1], getsum(l, r + 1, r, m, 0));//rep(j, l, r) rep(k, r + 1, m) add(dp[i][l][r][1], dp[i-1][j][k][0]);add(dp[i][l][r][1], getsum(l, r, r, m, 1));//rep(j, l, r) rep(k, r, m) add(dp[i][l][r][1], dp[i-1][j][k][1]);add(dp[i][l][r][2], getsum(1, l, l - 1, r, 0));//rep(j, 1, l - 1) rep(k, l, r) add(dp[i][l][r][2], dp[i-1][j][k][0]);add(dp[i][l][r][2], getsum(1, l, l, r, 2));//rep(j, 1, l) rep(k, l, r) add(dp[i][l][r][2], dp[i-1][j][k][2]);add(dp[i][l][r][3], getsum(1, r + 1, l - 1, m, 0));//rep(j, 1, l - 1) rep(k, r + 1, m) add(dp[i][l][r][3], dp[i-1][j][k][0]);add(dp[i][l][r][3], getsum(1, r, l - 1, m, 1));//rep(j, 1, l - 1) rep(k, r, m) add(dp[i][l][r][3], dp[i-1][j][k][1]);add(dp[i][l][r][3], getsum(1, r + 1, l, m, 2));//rep(j, 1, l) rep(k, r + 1, m) add(dp[i][l][r][3], dp[i-1][j][k][2]);add(dp[i][l][r][3], getsum(1, r, l, m, 3));//rep(j, 1, l) rep(k, r, m) add(dp[i][l][r][3], dp[i-1][j][k][3]);}}rep(j, 1, m) rep(k, j, m) rep(l, 0, 3) add(ans, dp[i][j][k][l]);rep(l, 0, 3){rep(j, 1, m) rep(k, 1, m){sum[j][k][l] = (1ll * sum[j-1][k][l] + sum[j][k-1][l] - sum[j-1][k-1][l] + dp[i][j][k][l] + mod) % mod;}}}printf("%d\n", ans);return 0;
}

Over.

Codeforces 273D Dima and Figure相关推荐

  1. CODEFORCES 272C Dima and Staircase 细节理解题+简单技巧

    传送门:http://codeforces.com/problemset/problem/272/C C. Dima and Staircase time limit per test 2 secon ...

  2. codeforces 400D Dima and Bacteria 并查集+floyd

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...

  3. Codeforces - 272C Dima and Staircase(思维)

    题目链接---- Dima's got a staircase that consists of n stairs. The first stair is at height a1, the seco ...

  4. CodeForces - 272C Dima and Staircase (线段树区间更新)

    题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...

  5. CodeForces - 366C Dima and Salad

    Dima and Salad 题 意 :有n个物品,价值为val[i],重量为cost[i],问最后背包中物品价值和比重量和为k的最大价值. 数据范围: 1<=n<=100 1<=k ...

  6. codeforces 400D - Dima and Bacteria

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意:n个培养基,m种仪器,分成k种,每种细菌数量c[i],然后就给出从第i到第j个培养基转 ...

  7. Codeforces 272C Dima and Staircase 思维 or 线段树

    点击打开链接 题意:给出n个物品高度ai,ai<=1e9,ai非递减,n,m<=1e5,m个方块的宽度和高度,问m个方块依次落下时达到的高度 每次都从左端点1开始叠放,第i个方块肯定落在第 ...

  8. CodeForces 366C Dima and Salad (背包dp)

    题意:给出n件物品,每件物品都有a.b两个值,从中取几件使得其中a值总和最大,并且a的和等于k倍的b的和. The first line of the input contains two integ ...

  9. CodeForces - 366C Dima and Salad (01背包)

    题意:n件东西,有属性a和属性b.要选取若干件东西,使得\(\frac{\sum a_j}{\sum b_j} = k\).在这个条件下,问\(\sum a_j\)最大是多少. 分析:可以将其转化为0 ...

  10. Codeforces 400D Dima And Bacteria 暴力+Floyd

    题意:n点,m条带权边的无向图,每个顶点属于k类中的某一类,定义合法,同一类中的任意两点存在代价为0的路径,若合法,求出d[i][j]矩阵,表示第i类到第j类的最小代价. n,m<=1e5,k& ...

最新文章

  1. HDU 1084 - What Is Your Grade?
  2. 洛谷 P1985 翻转棋
  3. 关于sklearn中“决策树是否可以转化为json并进行绘制”的调研
  4. 华为笔试题-磁盘容量排序
  5. 项目内置广告后续:npm 禁止终端广告
  6. shell 提取sql 的字段名表名_Mysql常用SQL语句集锦 |建议转发收藏
  7. 我的常用数据软件大公开
  8. sqlmap注入命令大全
  9. 基于单片机的数控直流稳压电源设计
  10. one class classification
  11. PTA 7-2 复数与基本类型的加减运算
  12. VC遍历INI配置文件
  13. 我国网民规模近10亿:4成初中学历 近3成月收入超5000元
  14. 中国LINUX公社(论坛)
  15. window11安装JDK1.8【jdk-8u121】
  16. WORD批量修改文献引用为上标
  17. vs2019 自定义工具错误: 未能生成文件: 系统找不到指定的文件。 (异常来自 HRESULT:0x80070002)
  18. Matlab怎么修改显示数值格式/精度/小数位数
  19. 【阅读材料精选 From-to-Date:2019.05.25~2019.06.28】
  20. Flash与Flex3的配合,特总结一下心得体会

热门文章

  1. 数据结构实验——用链表实现简单的多项式乘法
  2. 2018年需要记住的5个区块链事实
  3. js table 生成序号_JS自动为表格增加序号
  4. 明月当空照,python3D编程初阶:坐标、模型、纹理与光
  5. 视频基础知识 720P、1080i、1080P
  6. C语言之迷宫小游戏2.0版(随机生成地图,可变颜色,优化游戏体验)
  7. Partition table entries are not in disk order 解决方法
  8. The kernel appears to have died. It will restart automatically
  9. 【那些年,我们一起追的女孩】第十一章
  10. 自定义皮肤,你值得拥有!