首页 > 其他分享 >状态机模型DP

状态机模型DP

时间:2023-11-11 13:22:06浏览次数:34  
标签:int res 模型 memset cin 状态机 DP sizeof dp

//http://ybt.ssoier.cn:8088/problem_show.php?pid=1302

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int dp[N][3][3],n,w[N],t;
int main()
{
    cin>>t;
    while(t--){
        cin>>n;
        int res=0;
        memset(dp,-0x3f,sizeof dp);
        for(int i=1;i<=n;i++) cin>>w[i];
        for(int i=0;i<=n;i++) dp[i][0][0]=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=2;j++){
                dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]+w[i]);
                dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][0]-w[i]);
            }
        }
        cout << max(dp[n][0][0], max(dp[n][1][0], dp[n][2][0])) << endl;
        //注意这里,要把三种情况都判断,只买一次的情况是,再买第二次就亏了,所以买了直接卖出,这种算第一次的最大值 
    }
    return 0;
}

//https://www.acwing.com/problem/content/1059/

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int dp[N][101][2],n,m,k,res,w[N];
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    memset(dp,-0x3f,sizeof dp);
    for(int i=0;i<=n;i++) dp[i][0][0]=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]+w[i]);
            dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][0]-w[i]);
        }
    }
    for(int i=0;i<=m;i++) res=max(res,dp[n][i][0]);
    cout<<res<<endl;
    return 0;
}

//https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/

// dp[i][j],0为当前有票,1为没票的第一天,2为没票的第二天或更多天 

#include<bits/stdc++.h>
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        int dp[100001][3],res=0,w[100001];
        memset(dp,0,sizeof dp);
        for(int i=0;i<n;i++) w[i+1]=prices[i];
        dp[0][0]=dp[0][1]=-0x3f3f3f3f;
        dp[0][2]=0;
        for(int i=1;i<=n;i++){
            dp[i][0]=max(dp[i-1][0],dp[i-1][2]-w[i]);
            dp[i][1]=dp[i-1][0]+w[i];
            dp[i][2]=max(dp[i-1][1],dp[i-1][2]);
        }
        return max(dp[n][1],dp[n][2]);
    }
};

//题目:
//你现在需要设计一个密码 S,S 需要满足:
//
//S 的长度是 N;
//S 只包含小写英文字母;
//S 不包含子串 T;
//例如:abc 和 abcde 是 abcde 的子串,abd 不是 abcde 的子串。
//请问共有多少种不同的密码满足要求?
//由于答案会非常大,请输出答案模 10e9+7 的余数。
//
//输入格式
//第一行输入整数N,表示密码的长度。
//第二行输入字符串T,T中只包含小写字母。
//
//输出格式
//输出一个正整数,表示总方案数模 10e9+7 后的结果。
//
//数据范围
//1≤N≤50,
//1≤|T|≤N,|T|是T的长度。
//
//输入:
//2
//a
//1
//2
//3
//输出:
//625

#include<bits/stdc++.h>
using namespace std;
const int N=55,mod=1e9+7;
int dp[N][N],n,m,ne[N],res;
char str[N];
int main()
{
    cin>>n>>str+1;
    m=strlen(str+1);
    for(int i=2,j=0;i<=n;i++){
        while(j&&str[i]!=str[j+1]) j=ne[j];
        if(str[i]==str[j+1]) j++;
        ne[i]=j;
    }
    dp[0][0] = 1;  //初始化,对于第0位密码,且匹配字串的位置为0时的方案数为1
    for(int i=0;i<n;i++){//枚举密码长度
        for(int j=0;j<m;j++){//枚举密码长度为i,且子串s匹配的位置为j时的状态,
            for(char k='a';k<='z';k++){//对于第i+1位字母,枚举26种可能的情况,
                //当前密码位数为i,且子串匹配的位置是j,尝试用i+1为k的情况进行跳转,
                //1.如果u能够跳转到子串s的最后一位(u==m),说明密码第i+1位为k时,密码中会包含子串s,
                //2.反之则说明当密码的i+1位为k时不会包含子串s (u<m),也就是合法方案,可以进行更新,
                int u=j;
                while(u&&k!=str[u+1]) u=ne[u];
                if(k==str[u+1]) u++;
                if(u<m) dp[i+1][u]=(dp[i+1][u]+dp[i][j])%mod;
            }
        }
    }
    for(int i=0;i<m;i++) res=(res+dp[n][i])%mod;
    cout<<res;
    return 0;
}

 

标签:int,res,模型,memset,cin,状态机,DP,sizeof,dp
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17825820.html

相关文章

  • OpenGL 模型加载详解
    1.Assimp目前为止,我们已经可以绘制一个物体,并添加不同的光照效果了。但是我们的顶点数据太过简单,只能绘制简单的立方体。但是房子汽车这种不规则的形状我们的顶点数据就很难定制了。索性,这部分并不需要我们苦逼的开发人员去考虑。成熟的3D建模工具可以将设计师设计的模型导出模......
  • 领域和领域模型
    领域domain一个组织做的事情;领域的作用:解决通用的问题,没有组织特性;项目中的领域:把模型单独放到一个领域;不同的业务划分成不同的领域,隔开服务; 对于领域的对象进行建模,从而抽象出来模型; 领域通用语言和界限上下文 通用语言:1就是1,2就是2;1表示12表示2就是通用......
  • [题解] AT_dp_w Intervals
    Intervals有\(m\)条形如\((l,r,a)\)的限制,表示如果\(s_{[l,r]}\)中有1就会有\(a\)的价值。你要求长度为\(n\)的01串的价值的最大值。\(n,m\le2\times10^5\)。将每个限制挂到右端点上,在右端点处计算贡献。然后我们就只关心最后一个1出现的位置了。......
  • 【小沐学前端】Windows下搭建WordPress(一、相关工具下载)
    1、简介WordPress是基于PHP和MySQL的免费开源内容管理系统(CMS)。它是全球使用最广泛的CMS软件,截至2019年5月,它为排名前1000万个网站中提供了超过30%的支持,并拥有在使用CMS构建的所有网站中,估计有60%的市场份额。1.1Nginxnginx[enginex]是一个HTTP和反向代理服务器,邮件代理......
  • 关于W3C制定的 JavaScript 标准事件模型,先事件捕获从windows > document 往下级直到
    关于W3C制定的JavaScript标准事件模型,先事件捕获从windows>document往下级直到特定的事件节点,然后进行事件处理,再事件冒泡,从特定节点往上级,这个完整的过程dom2规定的事件流包括3个阶段:①事件捕获,②处于目标阶段(事件处理),③事件冒泡阶段。DOM2级事件"规定事件流的三个阶......
  • To_Heart—总结——连通块 dp(抑或 连续块 dp)
    简介有一类问题,他们需要计算满足在序列上插入给定顺序的元素,其贡献/限制只与两旁的元素有关,但元素插入的位置是不一定的,所以会有代价的最值和方案数的统计。而对于这类问题,我们其实可以不关心每一次插入的具体位置在哪里,而只关注他的相对位置(比如在某个数左边、在某个数左边且与......
  • 机器学习——语言模型和数据集
     语言模型 马尔可夫模型和n元语法 自然语言统计 读取长序列数据由于序列数据本质上是连续的,因此我们在处理数据时需要解决这个问题。在 8.1节中我们以一种相当特别的方式做到了这一点:当序列变得太长而不能被模型一次性全部处理时,我们可能希望拆分这样的序列方......
  • 基于大模型的日程管理通知系统——数据库设计心得
    项目:基于大模型的日程管理通知系统指导老师:李友焕组名:PMA班级:软件21011.  前言上学期数据库系统的课程,让我们了解了数据库的基本操作和设计原则。我们认识到良好的数据库设计在工程项目中是至关重要的。它直接影响到项目的成功与否,对系统的性能、安全性、可维护性和用户体......
  • 基于 three.js 加载器分别加载模型
    点击查看代码/***参数:模型文件路径,成功回调函数**基于three.js加载器分别加载模型**全部加载后通过回调函数传出打印*/import{FBXLoader}from'three/examples/jsm/loaders/FBXLoader.js'import{GLTFLoader}from'three/examples/jsm/loaders/GLTF......
  • 机器学习——序列模型
    在本质上,音乐、语音、文本和视频都是连续的。如果它们的序列被我们重排,那么就会失去原有的意义。比如,一个文本标题“狗咬人”远没有“人咬狗”那么令人惊讶,尽管组成两句话的字完全相同。处理序列数据需要统计工具和新的深度神经网络架构。为了简单起见,我们以 图8.1.1所示的股......