首页 > 其他分享 >一些转移细节还不太清楚的线性dp

一些转移细节还不太清楚的线性dp

时间:2023-10-06 22:33:05浏览次数:38  
标签:int long 细节 清楚 线性 dp

D. Round Subset

老早写过了,但是边界考虑不太清楚
https://codeforces.com/problemset/problem/837/D

#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N = 205, M = 30 * 200;
int n, k, ans, t2[N], t5[N], f[2][N][M]; //f[i][j]: 选了i个, 5的值为j的最大2的个数

int main () {
    scanf ("%d%d", &n, &k);
    for (int i = 1; i <= n; i++) {
        ll x;
        scanf ("%lld", &x);
        while (x && x % 2 == 0)  t2[i]++, x /= 2;
        while (x && x % 5 == 0)  t5[i]++, x /= 5;
        //cout << t2[i] << ' ' << t5[i] << endl;
    }
    memset (f, -1, sizeof f);
    f[0][0][0] = f[1][0][0] = 0;
    for (int ii = 1; ii <= n; ii++) {
        int t = ii & 1, tt = t ^ 1;
        for (int i = 0; i <= min (ii, k); i++) { //i之前选了多少
            for (int j = 0; j <= 30 * i; j++) { //之前有多少个5
                if (!i || j < t5[ii] || f[t][i - 1][j - t5[ii]] == -1)   continue;
                f[tt][i][j] = max (f[tt][i][j], f[t][i - 1][j - t5[ii]] + t2[ii]);
            }
        }
        //记得滚过来
        for (int i = 0; i <= min (ii, k); i++) { 
            for (int j = 0; j <= 30 * i; j++) {
                f[t][i][j] = f[tt][i][j];
            }
        }
    }
    for (int i = 0; i <= 30 * n; i++)    ans = max (ans, min(f[n & 1][k][i], i));
    cout << ans << endl;
    //cout << log (1e18) / log (5);
}

标签:int,long,细节,清楚,线性,dp
From: https://www.cnblogs.com/CTing/p/17745208.html

相关文章

  • 线性代数01
    配图是:ArianaGrande,2023年世界最美女人第三名。这是麻省理工18.06课程,线性代数(LinearAlgebra),讲课的是W.GilbertStrang。课本用的书是《IntroductiontoLinearAlgebra》。coursewebpage上有大量的exercises、matlab代码、课程的syllabus。课程的网页是web.mit.edu/......
  • 背包DP
    题目背景:你有一个容量为M的背包,有N个物品,每个物品的重量和价值分别为w[i]和c[i],现在选一些物品放入这个背包使装入的价值最大1.01背包(每件物品只有1件):倒序枚举重量,O(N^2) E(i,n){ cin>>w>>c; for(intj=m;j>=w;--j)f[j]=max(f[j],f[j-w]+c); }2.完全背包(每件物品......
  • Python使用socket的UDP协议实现FTP文件服务
    简介本示例主要是用Python的socket,使用UDP协议实现一个FTP服务端、FTP客户端,用来实现文件的传输。在公司内网下,可以不适用U盘的情况下,纯粹使用网络,来实现文件服务器的搭建,进而实现文件的网络传输。同时用来理解Python的socket使用。服务端运行起来后,会把服务器上面的指......
  • 算法之动态规划(DP)求解完全背包问题(状态转移式方程推导)
    完全背包是01背包的进阶版。在这里补充一下代码随想录的完全背包状态转移式的推导。有兴趣的可以先看一看原版。状态转移方程状态:dp[i][j]选择前i个物品,容量为j的背包时所选物品价值总和最大。状态转移:dp[i][j]=max(dp[i-1][j-k*v[i]]+k*w[i])(k=0,1,2,3...)(j-k*v......
  • 10.5 认识XEDParse汇编引擎
    XEDParse是一款开源的x86指令编码库,该库用于将MASM语法的汇编指令级转换为对等的机器码,并以XED格式输出,目前该库支持x86、x64平台下的汇编编码,XEDParse的特点是高效、准确、易于使用,它可以良好地处理各种类型的指令,从而更容易地确定一段程序的指令集。XEDParse库可以集成到许多不......
  • Numpy手撸神经网络实现线性回归
    Numpy手撸神经网络实现线性回归简介在深度学习理论学习之后,我们常常会直接使用深度学习框架(如PaddlePaddle、PyTorch或TensorFlow)来构建模型,而忽略了底层各种层结构的实现。但对于深度学习的学习者来说,是否能够亲手编写一个简单的模型呢?本文将介绍如何使用NumPy手动实现一个神经......
  • DP提高专项3
    本场比赛难度吧不大,建议开题顺序为\(T2-T1-T3\)。\(T2\)题目描述有\(n\)个高楼排成一行,每个楼有一个高度\(h_i\)。称可以从楼\(i\)跳到楼\(j\),当\(i\),\(j\)(\(i<j\))满足以下三个条件之一:\(i+1=j\)\(\max(h_{i+1},h_{i+2},\cdots,h_{j-1})<\min(h_i,h_j......
  • 【DP】ABC273F Hammer 2 题解
    ABC273F一道比较板的区间\(\text{dp}\)。先对坐标离散化,令离散化数组为\(v\)。令\(f_{i,j}\)表示能走到区间\([v_i,v_j]\)的最短路程,显然\(f\)数组初始为\(inf\)。但发现这样无法转移,可以再增加一维\(k\in\{0,1\}\),表示此时在\([v_i,v_j]\)的\(v_i/v_j\)处。......
  • 【思维】【DP】ABC298Ex Sum of Min of Length 题解
    ABC298Ex简单题。因为有\(\min\)不好做,容易想到讨论\(d(i,L)\)和\(d(i,R)\)的大小。令\(p=\text{LCA}(L,R)\),\(dep_L>dep_R,dist=dep_L+dep_R-2\timesdep_p\),\(now\)满足\(dep_L-dep_{now}=\lfloor\dfrac{dist}{2}\rfloor\)则\(L\)一定在......
  • 动态规划--DP
    动态规划动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。背包01背包每个物体只有两种可能的状态(取与不取),对应二进制中的\(0\)和\(1\),这类问题便被称为「0-1背包问题」。状态转移方程:\[f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w_{i}}+v_{i})\]这......