首页 > 其他分享 >923kmp 01背包

923kmp 01背包

时间:2024-09-23 22:34:03浏览次数:7  
标签:01 string int Next nextt ++ 背包 923kmp size

kmp遍历一次主串匹配 子串求next数组 看前后缀相同的个数 不匹配时根据next的值移动

p3375

点击查看代码

void getNext(string s, int nextt[]) {
    int j = 0;
    nextt[0] = 0;
    for (int i = 1; i < s.size(); i++) {
        while (j > 0 && s[i] != s[j]) {
            j = nextt[j - 1];
        }
        if (s[i] == s[j]) j++;
        nextt[i] = j;
    }
}

void matchstr(string a, string b) {
    getNext(b, Next);
    int j = 0;
    for (int i = 0; i < a.size(); i++) {
        while (j > 0 && a[i] != b[j]) {
            j = Next[j - 1];
        }
        if (a[i] == b[j]) j++;
        if (j == b.size()) {
            arr[po] = i - b.size() + 1;
            po++;
            j = Next[j - 1];
        }
    }
}

背包
有一个转移状态方程
对于第i件物品分为放和不放 以及够不够放
还有边界条件
i = 0 的时候 没有物品 j = 0 没有余量 无法放入物品 此时最大价值都为0
暴力

点击查看代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];//v数组存储体积,w数组存储价值
int f[N][N];
int main ()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    
    for(int i=1;i<=n;i++)
        for(int j=0;j<=m;j++)
            {
                f[i][j]=f[i-1][j];//将不能放入第i件物品的情况和能放入但是没放入的情况合并
                if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
            }
    cout<<f[n][m]<<endl;
    return 0;
}

改进 把f i j 二维转成一维

p1002 过河卒

标签:01,string,int,Next,nextt,++,背包,923kmp,size
From: https://www.cnblogs.com/yanqiwen/p/18428069

相关文章

  • Day 23 贪心算法part01| LeetCode 455.分发饼干,376.摆动序列,53.最大子序和
    455.分发饼干455.分发饼干classSolution{publicintfindContentChildren(int[]g,int[]s){Arrays.sort(g);Arrays.sort(s);intindex=s.length-1;intcount=0;for(inti=g.le......
  • 【刷题笔记】2019 CSP-S
    2019CSP-S题目整理A-格雷数思路简介思路很简单,如果编号在中点的左边那么就输出0,否则输出1,同时还要改变编号。代码实现#include<bits/stdc++.h>#definemaxn80usingnamespacestd;typedef__int128int1;int1n,k;__int128read(){ charch=getchar(); __int128......
  • LGP1901 题解
    原题链接:P1901发射站难度:Easy。注意到"最近的且比它高",容易想到用单调栈维护每个能量发射站左右第一个比它高的,最后统计答案即可。具体的令f[i][0/1]表示能量发射站\(i\)右边/左边第一个\(h_x>h_i\)的位置\(x\)。用单调栈从左向右扫一遍,得到f[i][0]。用单调栈从右......
  • 01.堆和栈
    1.堆(heap)用于动态分配内存,位于BSS和栈中间的地址区域,由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的malloc/free造成内存空间的不连续,会产生碎片。(经常问如何解决内存碎片?)当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间,因此堆......
  • AI 大模型计算机科学家群英传:明斯基(Marvin Lee Minsky,1927年—2016年)
    AI大模型计算机科学家群英传:明斯基(MarvinLeeMinsky,1927年—2016年)作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming1.背景介绍1.1问题的由来人工智能(ArtificialIntelligence,AI)作为一门横跨计算机科学、认知科学、数学等多个学科的交叉学......
  • leetcode刷题day27|贪心算法Part01(455.分发饼干、376. 摆动序列、53. 最大子序和)
    前言:贪心的本质选择每一阶段的局部最优,从而达到全局最优。455.分发饼干思路:局部最优-大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个;全局最优:喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序,然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计......
  • [GXYCTF2019]BabySQli
    这题查看源码后发现一个php文件问了ai后发现MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5是一段base32编码,经过base32解码,base64解码后的结果是select*fromuserwhereusername='$name'很明显是一个sql语句,在us......
  • ADAU1701的Dynamics Processors算法补充例程合集(10个例程)
    作者的话做ADAU1701,心血来潮,再过了一遍SigmaDSP的算法合辑,发现有不少遗留的,比较有特点的算法,就在这个系列文章里一一呈现吧。ADAU1701我写了超过100个例程,但是都很早期,2018年开始弄的,我感觉并不是很全,那这一次就彻底把他补全一下,这个系列文章,将把我能够找到的,ADI原厂提供......
  • 信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取
    信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取PDF文档公众号回复关键字:2024092312019CSP-J题目1数字游戏[题目描述]小K同学向小P同学发送了一个长度为8的01字符串来玩数字游戏,小P同学想要知道字符串中究竟有多少个1。注......
  • CF2001D Color Rows and Columns
    题目链接题解知识点:贪心,STL。显然,子序列最长长度是数的种类数,即保证每个数都会被选到。子序列的奇数位要尽可能大、偶数位尽可能小。我们从左到右依次选择子序列的数,为了保证每个数都能被选到,我们预处理出每个数的最晚出现位置\(lst\)。每次选择,只有在当前还未选择的数的\(......