首页 > 其他分享 >nefu-dp1 (线性dp)

nefu-dp1 (线性dp)

时间:2023-08-02 17:58:28浏览次数:44  
标签:const dp1 int ll long nefu using include dp

nefu-dp1

https://vjudge.csgrandeur.cn/contest/571200#overview
感谢z神的题单
dp废物来打基础了。
(感觉难度大概是递减的)

琪露诺

单调队列优化dp

#include <bits/stdc++.h>

using namespace std;
const int N = 2e5 + 5;
int f[N], a[N], n, l, r; //f[i]:i结尾的最大值

int main () {
    cin >> n >> l >> r;
    for (int i = 0; i <= n; i++)    cin >> a[i];
    queue<int> q; //单调队列优化dp
    memset (f, -0x3f, sizeof f);
    f[0] = a[0];
    q.push (0);
    for (int i = l; i <= n; i++) {
        while (!q.empty () && f[q.front ()] < f[i-l])   q.pop ();
        q.push (i - l);
        while (!q.empty() && q.front () < i - r)    q.pop ();
        f[i] = f[q.front ()] + a[i];
    }
    int ans = f[n];
    for (int i = 1; i < r; i++)    ans = max (ans, f[n-i]);
    cout << ans << endl;
}

护卫队

要用到一个dp辅助数组,提前预处理!

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

using namespace std;
const int N = 1005;
const double inf = 1e18;
ll n, s, W, w[N];
double f[N], t[N][N], tt[N]; //f[i]: 前i辆车通过的最短时间, t[i][j]: i-j位一车队的通过时间

int main () {
    cin >> W >> s >> n;
    for (int i = 1; i <= n; i++) {
        f[i] = inf;
        for (int j = 1; j <= n; j++) {
            t[i][j] = inf;
        }
    }
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> w[i] >> x;
        tt[i] = 1.0 * s / x * 60;
        t[i][i] = tt[i];
        w[i] += w[i-1];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            t[i][j] = max (t[i][j-1], tt[j]);
            //cout << t[i][j] << ' ';
        }
        //cout << endl;
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            if (w[i] - w[j-1] > W)  continue;
            f[i] = min (f[i], f[j-1] + t[j][i]);
        }
    }
    cout << fixed << setprecision (1) << f[n];
}

书的复制

重点在于方案输出,pre数组记录

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

using namespace std;
const int N = 505;
int n, m, pre[N];
ll a[N], s[N], f[N][N]; //f[i][j]: 考虑到第i人,划分了j组的最小抄写时间

int main () {
    memset (f, 0x3f, sizeof f);
    cin >> n >> m;
    for (int i = 1; i <= n; i++)    cin >> a[i], s[i] = s[i-1] + a[i];
    for (int i = 1; i <= n; i++)    f[i][1] = s[i];

    for (int i = 1; i <= n; i++) {
        int id = 0;
        for (int j = 1; j <= min (i, m); j++) {
            for (int k = 1; k < i; k++) {
                f[i][j] = min (f[i][j], max (f[k][j-1], s[i] - s[k]));
            }
            //cout << f[i][j] << ' ';
        }
        //cout << endl;
    }
    //cout << f[n][m] << endl;
    int s = 0, w = n;
	for(int i = n; i >= 1; i--){//这里贪心,因为后面的人抄尽量多,前面少,所以倒过来枚举
		s += a[i];
		if (s > f[n][m])    s = a[i], pre[w] = i + 1, w = i;//pre[w]记录这个人抄书的开始位置
	}
	cout << 1 << ' '  << w << endl;//第一组特判
    //output (n);
    //for (int i = 1; i <= n; i++)    cout << pre[i] << ' ';
    for (int i = 1; i <= n; i++) {
        if (pre[i])     cout << pre[i] << ' ' << i << endl;
    }
}

摆花

重点在方案涉及,二维即可

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

using namespace std;
const int N = 105, mod = 1e6 + 7;
int n, m, a[N];
ll f[N][N]; //f[i][j]: 前i种花盆摆了j个的方案数

int main () {
    cin >> n >> m;
    for (int i = 1; i <= n; i++)    cin >> a[i];
    f[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= m; j++) { //该种花也可以一个都不摆
            for (int k = 0; k <= min(j, a[i]); k++) {
                (f[i][j] += f[i-1][j-k]) %= mod;
            }
        }
    }
    cout << f[n][m] << endl;
}

导弹拦截

二分优化求LIS

    #include <bits/stdc++.h>

    using namespace std;
    const int N = 1e5 + 5;
    int a[N], f[N]; //f[i]: 长度为i的结尾最大值

    int main () {
        int n = 0, x, len;
        while (cin >> x)    a[++n] = x;
        
        f[1] = a[1], len = 1;
        for (int i = 2; i <= n; i++) {
            if (a[i] <= f[len])     f[++len] = a[i];
            else {
                int l = 1, r = len;
                while (l < r) {
                    int mid = l + r >> 1;
                    if (f[mid] < a[i])  r = mid;
                    else    l = mid + 1;
                }
                f[r] = a[i];
            }
        }
        //for (int i = 1; i <= len; i++)  cout << f[i] << ' ';
        cout << len << endl;

        //不升序列个数等于最长上升序列长度
        f[1] = a[1], len = 1;
        for (int i = 1; i <= n; i++) {
            if (a[i] > f[len])      f[++len] = a[i];
            else {
                int l = 1, r = len;
                while (l < r) {
                    int mid = l + r >> 1;
                    if (f[mid] >= a[i]) r = mid;
                    else    l = mid + 1;
                }
                f[l] = a[i];
            }
        }
        //for (int i = 1; i <= len; i++)  cout << f[i] << ' ';
        cout << len << endl;

    }

开心的金明

萌萌题

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

    using namespace std;
    const int N = 3e4 + 5, M = 30, mod = 1e6 + 7;
    int n, m;
    ll f[M][N], ans; //f[i][j]: 前i个物品剩j元的最大价值

    int main () {
        cin >> m >> n;
        for (int i = 1; i <= n; i++) {
            int a, b;
            cin >> a >> b;
            for (int j = m; j >= 0; j--) {
                f[i][j] = f[i-1][j];
                if (j - a >= 0)    f[i][j] = max (f[i-1][j], f[i-1][j-a] + 1ll * a * b);
            }
        }
        for (int i = 0; i <= m; i++)    ans = max (ans, f[n][i]);
        cout << ans << endl;
    }

小A点菜

萌萌题

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

using namespace std;
const int N = 105, M = 10005;
int n, m, a;
ll f[N][M]; //f[i][j]: 前i个菜剩j元的方案

int main () {
    cin >> n >> m;
    f[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        cin >> a;
        for (int j = m; j >= 0; j--) {
            f[i][j] += f[i-1][j];
            if (j >= a) f[i][j] += f[i-1][j-a];
        }
    }
    cout << f[n][m] << endl;
}

砝码称重

萌萌题

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

using namespace std;
const int N = 10005;
int a[] = {1, 2, 3, 5, 10, 20}, ans, x;
bool f[N];

int main () {
    f[0] = 1;
    for (int i = 0; i < 6; i++) {
        cin >> x;
        for (int j = 1000; j >= 0; j--) {
            for (int k = x; k > 0; k--) {
                f[j + k * a[i]] |= f[j];
            }
        }
    }
    // for (int i = 0; i <= 1000; i++) {
    //     if (f[i])   cout << i << endl;
    // } 
    for (int i = 1; i <= 1000; i++)     ans += f[i];
    cout << "Total=" << ans << endl;
}

标签:const,dp1,int,ll,long,nefu,using,include,dp
From: https://www.cnblogs.com/CTing/p/17601341.html

相关文章

  • 8.2 day9图论+dp
    100+70+70+20=260感觉如果时间够感觉还能写一下,结果T3超大数据结构写死了T1观察到最短路径仍然最优,直接dij即可,注意判断终点不用等红灯T2暴力是\(O(n^4)\)的,是dp,但是我写的是分层图,同样时间,还没有优化空间,寄设计\(dp_{i,j}\)为跳到\((i,j)\)所需最小花费每次从所有点转移,算......
  • 使用UDP和RDP共享电脑屏幕和声音
    publicpartialclassForm1:Form{privateWasapiLoopbackCapturemic;//音频输入protectedRDPSession_rdpSession=null;publicForm1(){InitializeComponent();}staticThreadreceiveThrea......
  • dpkg
    dpkgDebianLinux系统上安装、创建和管理软件包补充说明dpkg命令是DebianLinux系统用来安装、创建和管理软件包的实用工具。语法dpkg(选项)(参数)选项-i:安装软件包;-r:删除软件包;-P:删除软件包的同时删除其配置文件;-L:显示于软件包关联的文件;-l:显示已安装软件包列表;--u......
  • dpkg-reconfigure
    dpkg-reconfigureDebianLinux中重新配制一个已经安装的软件包补充说明dpkg-reconfigure命令是DebianLinux中重新配置已经安装过的软件包,可以将一个或者多个已安装的软件包传递给此指令,它将询问软件初次安装后的配置问题。当用户需要再次对软件包配置的时候,可以使用dpkg-rec......
  • dpkg-deb
    dpkg-debDebianLinux下的软件包管理工具补充说明dpkg-deb命令是DebianLinux下的软件包管理工具,它可以对软件包执行打包和解包操作以及提供软件包信息。语法dpkg-deb(选项)(参数)选项-c:显示软件包中的文件列表;-e:将主控信息解压;-f:把字段内容打印到标准输出;-x:将软件包......
  • dpkg-preconfigure
    dpkg-preconfigureDebianLinux中软件包安装之前询问问题补充说明dpkg-preconfigure命令用于在DebianLinux中软件包安装之前询问问题。语法dpkg-preconfigure(选项)(参数)选项-f:选择使用的前端;-p:感兴趣的最低的优先级问题;--apt:在apt模式下运行。参数软件包:指定“.d......
  • 【学习笔记】数位 dp
    数位dp前置知识:记忆化搜索五大基础dpoi-wiki概念:数位dp,就是一个用来计数的动态规划,将一个长数分解为一个一个数位上的数进行统计。例如:求\(a-b\)区间不包含\(c\)的数的个数,保证\(0\leqa\leqb\leq2\times10^9\)。空间限制256MiB,时间限制1000ms。这个......
  • DPC WATCHDOG VIOLATION
    蓝屏SmbCo10X64.syshttps://answers.microsoft.com/zh-hans/windows/forum/all/%e6%9c%80%e8%bf%91%e7%94%b5%e8%84%91%e6%80%bb/d228ea4b-3945-4b1c-8c98-b1b3823d0213https://answers.microsoft.com/zh-hans/windows/forum/windows_11-windows_install/%e8%93%9d%e5%b1%8f/......
  • HC32F460串口波特率设置19200,函数返回ErrorInvalidParameter
    今天,在调试项目的时候,遇到设置串口2波特率为19200的时候,USART_SetBaudrate(M4_USART2,19200)函数返回 ErrorInvalidParameter,导致程序陷入了死循环,配置程序如下:voidUSART2_LIN_Config(void){#ifdefLIN_EN#ifdefHC32_MCUstc_usart_uart_init_tstcInitCfg;......
  • WordPress Qui-Pure V2.4发布纯文本/图文博客主题正式发布!
    主题介绍:Qui-Pure是我开发的第一款主题,纯文本展示博客类型,后台控制是否加载图片/轮播图,页面布局改成图文排版!兼容erphpdown,加入个人中心,由于技术学习来源互联网,WordPress是开源平台,因此主题免费回报大家,希望大家喜欢这款简约至上的主题!主题免费、免费、免费...主题功能:1.......