动态规划复习(持续更新)

Posted shixinyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划复习(持续更新)相关的知识,希望对你有一定的参考价值。

最近除了模拟赛和往年noip题自我测试,就只能搞点弱项专题训练了。

都是洛谷上的题,每次从水题开始:

 

便宜的回文

区间dp,对于一个字母,增删其实效果是相同的,取代价最小的即可。

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=3000+10;
int n,m,val[maxn],dp[maxn][maxn];
char c,s[maxn];

int aa;char cc;
int read() {
    aa=0;cc=getchar();
    while(cc<‘0‘||cc>‘9‘) cc=getchar();
    while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
    return aa;
}

int main() {
    m=read();n=read(); int x,y;
    scanf("%s",s+1);
    for(int i=1;i<=m;++i) {
        do c=getchar();while(c<‘a‘||c>‘z‘);
        x=c-‘a‘+1; y=min(read(),read());
        val[x]=y;
    }
    memset(dp,0x3f3f3f3f,sizeof(dp));
    for(int i=1;i<=n;++i) dp[i][i]=0;
    for(int i=1;i<n;++i) if(s[i]==s[i+1]) dp[i][i+1]=0;
    for(int l=1;l<n;++l) {
        for(int i=1;i<=n-l;++i) {
            int j=i+l;
            if(s[i]==s[j]&&l>1) dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
            dp[i][j]=min(dp[i][j],dp[i+1][j]+val[s[i]-‘a‘+1]);
            dp[i][j]=min(dp[i][j],dp[i][j-1]+val[s[j]-‘a‘+1]);
        }
    }
    printf("%d",dp[1][n]);
    return 0;
}

  

 

以上是关于动态规划复习(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章

动态规划习题本(持续更新)

动态规划习题本(持续更新)

动态规划习题本(持续更新)

动态规划之背包问题(持续更新)

leetcode动态规划题组笔记以及总结(持续更新)

算法设计与分析期中考试复习:代码和经典题目 分治二分动态规划(未完待续)