博客
关于我
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/

    你可能感兴趣的文章
    Objective-C实现bogo sort排序算法(附完整源码)
    查看>>
    Objective-C实现boruvka博鲁夫卡算法(附完整源码)
    查看>>
    Objective-C实现Boyer-Moore字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现BP误差逆传播算法(附完整源码)
    查看>>
    Objective-C实现breadth First Search广度优先搜索算法(附完整源码))
    查看>>
    Objective-C实现BreadthFirstSearch广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现BreadthFirstShortestPath广度优先最短路径算法(附完整源码)
    查看>>
    Objective-C实现bubble sort冒泡排序算法(附完整源码)
    查看>>
    Objective-C实现bucket sort桶排序算法(附完整源码)
    查看>>
    Objective-C实现Burke 抖动算法(附完整源码)
    查看>>
    Objective-C实现Burrows-Wheeler 算法(附完整源码)
    查看>>
    Objective-C实现CaesarsCiphe凯撒密码算法(附完整源码)
    查看>>
    Objective-C实现calloc函数功能(附完整源码)
    查看>>
    Objective-C实现canny边缘检测算法(附完整源码)
    查看>>
    Objective-C实现cartesianProduct笛卡尔乘积算法(附完整源码)
    查看>>
    Objective-C实现check strong password检查密码强度算法(附完整源码)
    查看>>
    Objective-C实现chudnovsky algorithm楚德诺夫斯基算法(附完整源码)
    查看>>
    Objective-C实现CIC滤波器(附完整源码)
    查看>>
    Objective-C实现circle sort圆形排序算法(附完整源码)
    查看>>
    Objective-C实现CircularQueue循环队列算法(附完整源码)
    查看>>