博客
关于我
2020.5.7普及C组 数数(count)【纪中】【DP】
阅读量:365 次
发布时间:2019-03-04

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

这是一道经典的动态规划问题,题目要求计算某个网格中从起点到终点的最小花费差。具体来说,网格中的每个单元格(i, j)都有一个花费a[i][j],目标是从起点(1, 1)走到终点(n, m),每一步只能向右或向下移动,循环边界处理时需要注意。

动态转移方程

动态规划的核心方程为:[ f[i][j][w] = (f[i][j][w] + fi-1][j][w - a[i][j]] + fi][j-1][w - a[i][j]]) \mod (10^8 + 7) ]这里,( f[i][j][w] ) 表示到达单元格(i, j)时,花费为w的最小值。方程的意义是,从(i, j)可以从左边(i, j-1)或上边(i-1, j)转移过来,需要减去a[i][j],然后加上当前单元格的花费。

边界处理

在循环处理过程中,需要注意以下几点:

  • 边界值处理:当i=1或j=1时,只能从另一边转移过来。
  • 花费差处理:从小到大处理,避免减法导致负数,确保循环边界正确。
  • 取模操作:每一步都要对结果取模,防止数值溢出。
  • 初始化

    初始化时,起点单元格的花费为:[ f1][1][a[1][1]] = 1 ]这表示从起点出发,花费为a[1][1]的路径只有一条。

    代码实现

    #include 
    #include
    #include
    #include
    #include
    using namespace std;long long a[110][110], f[110][110][2510];long long n, m, p;int main() { freopen("count.in", "r", stdin); freopen("count.out", "w", stdout); cin >> n >> m >> p; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; } } f[1][1][a[1][1]] = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { for (long long w = a[i][j]; w <= p; w++) { f[i][j][w] = (f[i][j][w] + f[i-1][j][w - a[i][j]] + f[i][j-1][w - a[i][j]]) % (10^8 + 7); } } } cout << endl; return 0;}

    代码解释

  • 输入处理:读取输入值n, m, p和网格中的每个单元格的花费a[i][j]。
  • 初始化:起点的花费为1。
  • 动态规划表计算:遍历每个单元格(i, j),计算所有可能的花费w。每一步都使用动态转移方程更新f[i][j][w]。
  • 输出:输出结果,通常用于单元格(n, m)的最小花费。
  • 这段代码通过动态规划有效地解决了问题,确保了在处理大规模数据时的高效性,同时通过取模操作防止了数值溢出。

    转载地址:http://tsle.baihongyu.com/

    你可能感兴趣的文章
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—5.Pipeline和Handler二
    查看>>
    Netty源码—6.ByteBuf原理一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理一
    查看>>
    Netty源码—8.编解码原理二
    查看>>
    Netty源码解读
    查看>>
    netty的HelloWorld演示
    查看>>
    Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
    查看>>
    Netty的网络框架差点让我一夜秃头,哭了
    查看>>
    Netty相关
    查看>>
    Netty简介
    查看>>
    Netty线程模型理解
    查看>>
    netty解决tcp粘包和拆包问题
    查看>>
    Netty速成:基础+入门+中级+高级+源码架构+行业应用
    查看>>
    Netty遇到TCP发送缓冲区满了 写半包操作该如何处理
    查看>>
    netty(1):NIO 基础之三大组件和ByteBuffer
    查看>>