区间dp

区间DP 入门 详解 P1880 [NOI1995]石子合并 要注意这是个环,是一个石子圈。 怕日后我自己又看不懂了就放个链接,还是很好理解的 时间复杂度O(8N3)O(8N^3)O(8N3) #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<... 阅读详情

Part1:总概

区间dp

顾名思义,就是解决一些区间内最优值的问题,通常的时间复杂度为n2n^2n2 或者 n3n^3n3

大致思路:

  • 首先确定状态

  • 初始化长度为1(or 2,3…具体因题而异)的dp数组的值

  • 然后枚举区间长度,枚举区间的起始点,(有的题目还需要枚举断点) 由小区间转移到大区间。

  • 最后dp[1][n]dp[1][n]dp[1][n]往往就是答案。

Part2:例题精讲

NOI1995 石子合并

思路分析:

贪心~很明显是不行的

好的,那我们还是开始想dp吧。区间dp常用的一个状态就是dp[i][j]表示i~j这个区间的最优值是多少?

我们可以看出题目中这个合并过程,很像是区间dp的一种合并,也就是说dp[i][j]dp[i][j]dp[i][j]可以由dp[i][k]dp[i][k]dp[i][k]和dp[k+1][j]dp[k+1][j]dp[k+1][j]转移过
那么我们自然而然的想到要枚举上一次合并是在哪个位置,也就是断点k,然后进行转
不过,由于这个题目的特殊限制,我们需要记录g[i][j]表示i到j这个区间有多少石子,来进行辅助转移

f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+g[i][k]+g[k+1][j])(i<=k<=j)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+g[i][k]+g[k+1][j]) ( i<=k<=j)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+g[i][k]+g[k+1][j])(i<=k<=j)

对于环,我们只需要把整个数组复制一遍,然后在统计答案的时候,把1-n开头的长度为n的区间的答案求一个min 就可以啦

Code

#include<bits/stdc++.h>
using namespace std;   
int n,minl,maxl,f1[300][300],f2[300][300],num[300];  
int s[300];  
int d(int i,int j)
{
    return s[j]-s[i-1];
}  
int main()
{
    cin>>n;
    for(int i=1;i<=n+n;i++)  
    {  
        cin>>num[i]; 
        num[i+n]=num[i];  
        s[i]=s[i-1]+num[i];  
    }  
    for(int p=1;p<n;p++)  
    {  
        for(int i=1,j=i+p;(j<n+n)&&(i<n+n);i++,j=i+p)  
        {  
            f2[i][j]=999999999;  
            for(int k=i;k<j;k++)  
            {  
                f1[i][j]=max(f1[i][j],f1[i][k]+f1[k+1][j]+d(i,j));   
                f2[i][j]=min(f2[i][j],f2[i][k]+f2[k+1][j]+d(i,j));  
            }  
        }  
    }  
    minl=999999999;  
    for(int i=1;i<=n;i++)  
    {  
        maxl=max(maxl,f1[i][i+n-1]);
        minl=min(minl,f2[i][i+n-1]);  
    }
    cout<<minl<<endl<<maxl;
    return 0;  
}

不过,这道题在hdu上(hdu3506)n^3的时间复杂度过不了

那么我们就需要考虑,四边形不等式优化!!

如果有f[a][c]+f[b][d]<=f[b][c]+f[a][d]f[a][c]+f[b][d]<=f[b][c]+f[a][d]f[a][c]+f[b][d]<=f[b][c]+f[a][d]
可以理解为一句话,交叉小于包含,即交叉的两个区间,a到c和b到d的值满足小于等于包含的两个区间[bc包含于ad])

则说这个东西满足四边形不等式,当然这个东西可能是dp数组,也可以是其他数组

这里有两个定理

1、如果上述的w函数同时满足区间包含单调性和四边形不等式性质,那么函数dp也满足四边形不等式性质

我们再定义s(i,j)s(i,j)s(i,j)表示 dp(i,j)dp(i,j)dp(i,j) 取得最优值时对应的下标(即 i≤k≤ji≤k≤ji≤k≤j 时,k 处的 dp 值最大,则 s(i,j)=ks(i,j)=ks(i,j)=k此时有如下定理

2、假如dp(i,j)dp(i,j)dp(i,j)满足四边形不等式,那么s(i,j)s(i,j)s(i,j)单调,即 s(i,j)≤s(i,j+1)≤s(i+1,j+1)s(i,j)≤s(i,j+1)≤s(i+1,j+1)s(i,j)≤s(i,j+1)≤s(i+1,j+1)

那么我们就可以开一个s数组 ,s[i][j]s[i][j]s[i][j]这个数组记录i ji~ji j这个区间的转移的最优点是哪个点

那么枚举断点是时候 直接可以从s[i][j−1] s[i+1[j]s[i][j-1] ~ s[i+1[j]s[i][j−1] s[i+1[j]枚举转移

(1)当函数w[i,j]满足w[i,j]+w[i′,j′]<=w[i′,j]+w[i,j′],i<=i′<=j<=j′w[i,j]+w[i',j']<=w[i',j]+w[i,j'],i<=i'<=j<=j'w[i,j]+w[i′,j′]<=w[i′,j]+w[i,j′],i<=i′<=j<=j′时,称w满足四边形不等式。

(2)当函数w[i,j]满足w[i’,j]≤w[i,j’],i<=i′<=j<=j′w[i’,j]≤w[i,j’],i<=i'<=j<=j'w[i’,j]≤w[i,j’],i<=i′<=j<=j′时称w关于区间包含关系单调。

很明显的,一开始定义的w[I,j]满足区间包含关系和四边形不等式。

现在我们要证明f[I,j]=minf[I,k]+f[k+1,j]+w[I,j]i<=k<jf[I,j]=min{f[I,k]+f[k+1,j]+w[I,j]}{i<=k<j}f[I,j]=minf[I,k]+f[k+1,j]+w[I,j]i<=k<j也满足四边形不等式

我们利用数学归纳法对四边形不等式中的区间长度进行归纳。

证明如下:

当i=i’或j=j’时,不等式显然成立。由此可知,当l≤1时,函数f满足四边形不等式。

下面分两种情形进行归纳证明:

  • 情形1:i<i’=j<j’i<i’=j<j’i<i’=j<j’
    在这种情形下,四边形不等式简化为如下的不等式:f[i,j]+f[j,j’]≤f[i,j’]+0f[i,j]+f[j,j’] ≤f[i,j’]+0f[i,j]+f[j,j’]≤f[i,j’]+0,设k=maxp∣f[i,j’]=f[i,p−1]+f[p,j’]+w[i,j’]k=max{p| f[i,j’]=f[i,p-1]+f[p,j’]+w[i,j’] }k=maxp∣f[i,j’]=f[i,p−1]+f[p,j’]+w[i,j’],再分两种情形k≤jk≤jk≤j或k>jk>jk>j。下面只讨论k≤jk≤jk≤j,k>jk>jk>j 的情况是类似的。

  • 情形1.1:k≤jk≤jk≤j,此时:

  • 情形1.2:k>jk>jk>j,略去

  • 情形2:i<i’<j<j’i<i’<j<j’i<i’<j<j’
    设 y=maxp∣f[i’,j]=f[i’,p−1]+f[p,j]+w[i’,j]y=max{p | f[i’,j]=f[i’,p-1]+f[p,j]+w[i’,j] }y=maxp∣f[i’,j]=f[i’,p−1]+f[p,j]+w[i’,j]f[p,j’]+w[i,j’]{f[p,j’]+w[i,j’] }f[p,j’]+w[i,j’]
    仍需再分两种情形讨论,即z≤yz≤yz≤y或z>yz>yz>y。下面只讨论z≤yz≤yz≤y,z>yz>yz>y的情况是类似的。
    情形2.1,i<z≤y≤ji<z≤y≤ji<z≤y≤j。
    显然的,我们有:
    f[i,j]+f[i′,j′]<=w[i,j]+f[i,z−1]+f[z,j]+w[i′,j′]+f[i′,y−1]+f[y,j′]f[i,j]+f[i',j']<=w[i,j]+f[i,z-1]+f[z,j]+w[i',j']+f[i',y-1]+f[y,j']f[i,j]+f[i′,j′]<=w[i,j]+f[i,z−1]+f[z,j]+w[i′,j′]+f[i′,y−1]+f[y,j′]
    因为w满足四边形不等式,所以:
    f[i,j]+f[i′,j′]<=w[i,j′]+w[i′,j]+f[i′,y−1]+f[i,z−1]+f[z,j]+f[y,j′]f[i,j]+f[i',j']<=w[i,j']+w[i',j]+f[i',y-1]+f[i,z-1]+f[z,j]+f[y,j']f[i,j]+f[i′,j′]<=w[i,j′]+w[i′,j]+f[i′,y−1]+f[i,z−1]+f[z,j]+f[y,j′]
    因为f[i,j′]+f[i′,j]=w[i,j′]+w[i′,j]+f[i′,y−1]+f[i,z−1]+f[y,j]+f[z,j′]f[i,j']+f[i',j]=w[i,j']+w[i',j]+f[i',y-1]+f[i,z-1]+f[y,j]+f[z,j']f[i,j′]+f[i′,j]=w[i,j′]+w[i′,j]+f[i′,y−1]+f[i,z−1]+f[y,j]+f[z,j′]
    所以,要证f[i,j′]+f[i′j]>=f[i,j]+f[i′,j′]f[i,j']+f[i'j]>=f[i,j]+f[i',j']f[i,j′]+f[i′j]>=f[i,j]+f[i′,j′],就要证f[z,j]+f[y,j′]<=f[y,j]+f[z,j′]f[z,j]+f[y,j']<=f[y,j]+f[z,j']f[z,j]+f[y,j′]<=f[y,j]+f[z,j′]。
    因为i<z≤y≤ji<z≤y≤ji<z≤y≤j,所以区间的长度会在不断地迭代中越变越小,最后归于前面的几种情况。

  • 情形2.1,i<y≤z≤ji<y≤z≤ji<y≤z≤j。证明过程略。
    综上所述,f[i,j]f[i,j]f[i,j]满足四边形不等式。
    事实上,对于任意f[I,j]=maxf[I,k]+f[k+1,j]+w[I,j]i<=k<jf[I,j]=max{f[I,k]+f[k+1,j]+w[I,j]}{i<=k<j}f[I,j]=maxf[I,k]+f[k+1,j]+w[I,j]i<=k<j,如果w满足四边形不等式,那么f也满足四边形不等式。
    前面千辛万苦证明了f满足四边形不等式,那么它有什么用呢?
    之所以要证明四边形不等式,就是为了证明f满足决策单调性,即:
    s[i,j−1]≤s[i,j]≤s[i+1,j],i≤js[i,j-1]≤s[i,j]≤s[i+1,j], i≤js[i,j−1]≤s[i,j]≤s[i+1,j],i≤j
    其中,s[I,j]s[I,j]s[I,j]为区间[I,j][I,j][I,j]上的最优决策。
    当i=ji=ji=j时,单调性显然成立。因此下面只讨论i<ji<ji<j的情形。由于对称性,只要证明s[i,j]≤s[i,j+1]s[i,j]≤s[i,j+1]s[i,j]≤s[i,j+1]。
    令fk[i,j]=f[i,k−1]+f[k,j]+w[i,j]fk[i,j]=f[i,k-1]+f[k,j]+w[i,j]fk[i,j]=f[i,k−1]+f[k,j]+w[i,j]。要证明s[i,j]≤s[i,j+1]s[i,j]≤s[i,j+1]s[i,j]≤s[i,j+1],只要证明对于所有i<k≤k’≤ji<k≤k’≤ji<k≤k’≤j且fk’[i,j]≤fk[i,j]fk’[i,j]≤fk[i,j]fk’[i,j]≤fk[i,j],有:fk’[i,j+1]≤fk[i,j+1]fk’[i,j+1]≤fk[i,j+1]fk’[i,j+1]≤fk[i,j+1]。
    事实上,我们可以证明一个更强的不等式

fk[i,j]−fk’[i,j]≤fk[i,j+1]−fk’[i,j+1]fk[i,j]-fk’[i,j]≤fk[i,j+1]-fk’[i,j+1]fk[i,j]−fk’[i,j]≤fk[i,j+1]−fk’[i,j+1]

也就是:fk[i,j]+fk’[i,j+1]≤fk[i,j+1]+fk’[i,j]fk[i,j]+fk’[i,j+1]≤fk[i,j+1]+fk’[i,j]fk[i,j]+fk’[i,j+1]≤fk[i,j+1]+fk’[i,j]

利用递推定义式将其展开整理可得:f[k,j]+f[k’,j+1]≤f[k’,j]+f[k,j+1]f[k,j]+f[k’,j+1]≤f[k’,j]+f[k,j+1]f[k,j]+f[k’,j+1]≤f[k’,j]+f[k,j+1],这正是k≤k’≤j<j+1k≤k’≤j<j+1k≤k’≤j<j+1时的四边形不等式

综上所述,当www满足四边形不等式时,函数s[i,j]s[i,j]s[i,j]具有单调性。

因此,我们可以得到一个更优化的转移方程

上述方法利用四边形不等式推出最优决策的单调性,从而减少每个状态转移的状态数,降低算法的时间复杂度。

这样这道题就解决了。

一般的,对于状态转移方程形如:f[i,j]=optf[i,k]+f[k+1,j]+w[i,j],i<jf[i , j] = opt{f[i , k] + f[k+1 , j]} + w[i , j], i < jf[i,j]=optf[i,k]+f[k+1,j]+w[i,j],i<j的动规,若w满足四边形不等式,则f满足四边形不等式,则f有决策单调性。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
 
using std::max;
using std::min;
 
const int maxn=300;
 
int base[maxn];
int dp[maxn][maxn],s[maxn][maxn];
int MAX[maxn][maxn];
 
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&base[i]);
        base[i+n]=base[i];
    }
    for(int i=1;i<=n*2;i++)
        base[i]+=base[i-1];
    for(int i=1;i<=n*2;i++)
        s[i][i]=i;
    for(int l=2;l<=n;l++)
        for(int i=1;i<=(n*2)-l+1;i++)
        {
            int j=i+l-1;
            int x=s[i][j-1],y=s[i+1][j];
            dp[i][j]=0x7fffffff;
            MAX[i][j]=max(MAX[i][j-1],MAX[i+1][j])+base[j]-base[i-1];//最大值不满足四边形不等式,但最有决策一定出现在端点处
            for(int k=x;k<=y;k++)
                if(dp[i][k]+dp[k+1][j]+base[j]-base[i-1]<dp[i][j])
                {
                    dp[i][j]=dp[i][k]+dp[k+1][j]+base[j]-base[i-1];
                    s[i][j]=k;
                }
        }
    int ansMin=0x7fffffff,ansMax=0;
    for(int i=1;i<n;i++)
        ansMin=min(ansMin,dp[i][i+n-1]),
        ansMax=max(ansMax,MAX[i][i+n-1]);
    printf("%d\n%d",ansMin,ansMax);
    return 0;
}

hdu4632 **

思路:

大致题意是给定一个字符串,求回文子序列个数,最后的答案要%10007,要求一个n^2的做法

首先定义f数组f[l][r]f[l][r]f[l][r]表示l rl~rl r区间的回文子序列个数,f[i][i]=1f[i][i]=1f[i][i]=1;

显然 根据容斥原理 :f[l][r]=f[l][r−1]+f[l+1][r]−f[l+1][r−1]f[l][r]=f[l][r-1]+f[l+1][r]-f[l+1][r-1]f[l][r]=f[l][r−1]+f[l+1][r]−f[l+1][r−1] (因为中间的个数会算两遍);

然后,我们考虑s[l]==s[r]s[l]==s[r]s[l]==s[r]的情况,如果这两个位置相等,那么l+1 r−1l+1 ~ r-1l+1 r−1这个区间的所有子序列,都可以加入l和r这两个元素,构成一个新的回文子序列,除此之外 l和r这两个元素也可以构成一个回文子序列

那么 if(s[l]==s[r])f[l][r]+=f[l+1][r−1]+1if (s[l]==s[r]) f[l][r]+=f[l+1][r-1]+1if(s[l]==s[r])f[l][r]+=f[l+1][r−1]+1;
Attention
做减法的时候,可能会有负数,为了使%不出现问题,我们需要先加mod再%mo

Code:

#inclue<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define mod 10007
int dp[1005][1005];
char s[1005]
int main()
{
	int t,cas=1;
    cin>>t;
    while(t--)
    {
        cin>>s;
        int len=strlen(s);
        memset(dp,0,sizeof dp);
        for(int i=0;i<len;i++)
            dp[i][i]=1;
        for(int j=0;j<len;j++)
        {
            for(int i=j-1;i>=0;i--)
            {
                dp[i][j]=(dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]+mod)%mod;
                if(s[i]==s[j])
                    dp[i][j]=(dp[i][j]+dp[i+1][j-1]+1)%mod;
            }
        }
        printf("Case %d: %d\n",cas++,dp[0][len-1]);
    }
    return 0;
}

hdu4745*********

题目大意:

给定一个数列,求一个最长的回文子序列

思路:

我们定义f[l][r]f[l][r]f[l][r]表示l到r区间的最长的回文子序列长度

如果s[l]==s[r]s[l]==s[r]s[l]==s[r] 则 f[l][r]=f[l+1][r−1]+2f[l][r]=f[l+1][r-1]+2f[l][r]=f[l+1][r−1]+2;

不然 f[l][r]=max(f[l+1][r],f[l][r−1])f[l][r]=max(f[l+1][r],f[l][r-1])f[l][r]=max(f[l+1][r],f[l][r−1]);

然后统计答案的时候

因为是环

由于考虑到可以从

同一个点出发,长度为n-1,+1

或者从不同的点出发,长度为n

Code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int s[1005],dp[2005][2005];
int main(){                                     //一个顺时针一个逆时针,并且元素
    int n,i,j,l,ans;                            //相同,因此相当于在环上求最长回
    while(scanf("%d",&n)!=EOF&&n){              //文子序列
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++){
            scanf("%d",&s[i]);
            s[i+n]=s[i];
            dp[i][i]=dp[i+n][i+n]=1;
        }
        for(l=2;l<=2*n;l++){
            for(i=1;i<=2*n-l+1;i++){
                j=i+l-1;
                dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                if(s[i]==s[j])
                dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2);
            }
        }                                       //当s[i]==s[j]时长度加2
        ans=0;
        for(i=1;i<=n;i++){                      //因为是环,所以起点可能在一个点,
            ans=max(ans,dp[i][i+n-1]);          //这样只需求长度是n-1的再加1即可
            ans=max(ans,dp[i][i+n-2]+1);
        }
        printf("%d\n",ans);
    }
    return 0;
}

hdu2476******

题目大意:

给定一个A串,一个B串,每次修改只能将一段连续区间内的字母,改成同一个字母,询问将A变成B 的最少操作次数

思路:

因为考虑到有相等的和不相等的部分,所以不能直接做

先假设A和B所有的对应位置都不相等,然后令f[l][r]f[l][r]f[l][r]表示l~r这个区间最小操作的次数

然后对一个区间l r 我们可以考虑,首先将f[l][r]=f[l+1][r]+1f[l][r]=f[l+1][r]+1f[l][r]=f[l+1][r]+1;表示需要在上一个区间的基础上,额外操作一次。然后枚举一个kkk

从l+1l+1l+1到rrr,如果b[k]==b[l]b[k]==b[l]b[k]==b[l] 那么 l这个位置 就可以在刷k的时候 刷上,而且不影响之前的区间。

既 f[l][r]=min(f[l][r],f[l][k]+f[k+1][r])f[l][r]=min(f[l][r],f[l][k]+f[k+1][r])f[l][r]=min(f[l][r],f[l][k]+f[k+1][r])

然后 我们令ans[i]ans[i]ans[i]表示A的第1到第iii 刷成和BBB相同的 需要的 最小的操作次数

若a[i]==b[i]a[i]==b[i]a[i]==b[i] 则 ans[i]=ans[i−1]ans[i]=ans[i-1]ans[i]=ans[i−1] (因为不需要刷)

else 枚举一个j 表示这个ans[i]ans[i]ans[i]从哪个答案转移过来

ans[i]=min(ans[i],ans[j]+f[j+1][i])ans[i]=min(ans[i],ans[j]+f[j+1][i])ans[i]=min(ans[i],ans[j]+f[j+1][i]);

hdu4283 ********

题目大意:

现在给定一个序列,表示每个人的不开心值D,假如他是第x个上场,那他就有(x-1)*D的不开心值,因为他等了k-1个人,你有一个类似于栈的东西,可以使用它来改变整个序列的顺序,求最少的 不开心值的和

思路:

由于修改顺序的时候,是要用类似栈的方式QWQ所以没法贪心…

这个题有一个性质,若第i个人是通过栈调整之后,第k个表演的 那么他能造成的影响 是可以比较容易计算的。

我们令f[l][r]f[l][r]f[l][r]表示 l rl~rl r这些人的最小等待时间

首先预处理一下所有人的等待时间的前缀和sum[i]sum[i]sum[i],便于计算

对于一个区间[l,r][l,r][l,r] 我们枚举第l个人是第几个出去的

kkk从l rl~rl r

假设他是第k个出去的

则 f[l][r]=min(f[l][r],f[l+1][k]+f[k+1][r]+(k−l)∗a[i]+(k−l+1)∗(sum[r]−sum[k]))f[l][r]=min(f[l][r],f[l+1][k]+f[k+1][r]+(k-l)*a[i]+(k-l+1)*(sum[r]-sum[k]))f[l][r]=min(f[l][r],f[l+1][k]+f[k+1][r]+(k−l)∗a[i]+(k−l+1)∗(sum[r]−sum[k]))

这里有几个要注意的地方:

  • 是f[l+1][k]f[l+1][k]f[l+1][k] 而不是 f[l][k]f[l][k]f[l][k] 因为这里枚举的就是第lll个人的出栈顺序

  • 2>(k−l)2>(k-l)2>(k−l)表示在这个人之前有几个人出去 (k−1+1)(k-1+1)(k−1+1)表示算上这个人 出去了几个人

poj2955

题目大意

给定一个只含小括号和中括号的序列,求一个最长的合法序列。

其中() [] ()[] (()) 等 是合法的

)( (] 等 是不合法的

思路

由于两个本身合法的序列拼在一起也是合法的序列,所以我们自然而然的就想到

令f[l][r]f[l][r]f[l][r]表示l rl~rl r这个区间的最长合法序列的程度

根据a[l]a[r]f[l+1][r−1]a[l] a[r] f[l+1][r-1]a[l]a[r]f[l+1][r−1]进行初始化

然后枚举断点,进行转移

这里有一个小tip就是

可以把左右括号分别变成正负的数字,便于判断

poj1651

题目大意

给定你一个序列

其中取走一个数的代价是它乘上它相邻的两个数

两头的数不可以取~

求最小代价

思路

令f[l][r]f[l][r]f[l][r]表示把l+1 r−1l+1 ~ r-1l+1 r−1的数都取走的最小代价

首先初始化f[i][i+2]f[i][i+2]f[i][i+2]这个区间

然后之后枚举长度,起始点,断点,进行转移即可

f[l][r]=min(f[l][r],f[l][k]+f[k][r]+a[l]∗a[k]∗a[r]f[l][r]=min(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]f[l][r]=min(f[l][r],f[l][k]+f[k][r]+a[l]∗a[k]∗a[r];

区间dp及经典习题 2024年的第一篇文章啊,也向大家送来一个迟来的新年祝福,接下来我将通过一些经典的习题来讲解一下区间dp区间dp就是以区间长度为阶段,由小的区间长度递推出大的区间长度的dp,口说无用,让我们见题说话吧。 阅读详情

相关推荐

微积分,用编程理解高数(python,C,C++)

很好理解,导数中,x是哪一点的导数,dx是精准度,y等于f(x)即函数。导数结果就是瞬时变化率。积分很好理解,a为下限,b为上限,y为函数,结果就是y=f(x)下a到b的面积。只要用定积分代入a=0,b=10(10s)y=x(1*x=1)就得到结果。F(x)为原函数,即微分后的函数是f(x)dx,微分前是F(x)一列车初始速度为10m/s,加速度为。才几十行代码,微积分也不是很难啊。,问速度达到20时车走了多少米。

linhhanpy的博客 1178

线性区间 dp 与环形区间 dp

区间dp就是在区间上进行动态规划,求解一段区间上的最优解;该问题的求解思路主要是通过合并小区间的最优解进而得出整个大区间上最优解的dp算法。(实际上还是通过子问题的解来求出原问题的解)

oscar1224的博客 2315

手把手复现论文:SVPWM过调制I区与II区算法仿真(附MATLAB源码)

本文详细介绍了SVPWM过调制I区与II区算法的MATLAB仿真实现,从理论推导到Simulink建模逐步解析。通过源码示例展示幅值补偿和六边形跟踪等关键技术,帮助电力电子研究者掌握过调制算法的核心实现方法,适用于电机控制、变频器等工业应用场景。

weixin_28739079的博客 529

区间DP详解

本文讲解了 区间DP 是什么,怎么转移,以及五道经典的区间DP例题和六道作业题,可快速带新手了解 区间DP 这一个属于动态规划的算法。

doooge_awa的博客 1190

MATPOWER的安装详细教程

MATPOWER的安装包实际为一个程序包,安装教程很简单,详见本文。

半个月亮Zz的博客 3万+

Tiff、jpg图片怎么样添加地理坐标信息

Tiff、jpg图片怎么样添加地理坐标信息 一般,外业调查只有地图资料,如专题图、或者地形图,如何把这些地图资料的扫描地图带上坐标信息,从而内业实现信息化处理?以上问题,可以解决,但根据不同情况有不同的处理方法。     第一种,上面有经纬度外框,图片是矩形,但是没有地理信息。 通过图框的两个角的坐标确定范围,分别是左上(140°E,30°N);右下(150°W,30°N) 解决方

树木_xzw的博客 2万+

区间dp 总结&详解

区间 dp

seanli1008的博客 1438

ESP32接入扣子(Coze) API使用自定义智能体

本示例将使用ESP32开发板通过WiFi接入 **Coze API**,实现一个简单的聊天机器人功能。用户可以通过串口向机器人输入问题,ESP32将通过Coze API与智能体进行通信,并返回对应的回复。本文将详细介绍了如何通过HTTP请求和JSON解析来与API进行交互,并给出完整的代码示例。

宁子希的博客 1万+

区间 dp 介绍

区间 dp 就是在区间上进行动态规划,求解一段区间上的最优解。

doudpyj的博客 1032

非线性功率放大器对QAM传输BER性能的影响及补偿

1、线性功率放大器对传输性能的影响 为表述非线性功率放大器对传输性能的影响,以Saleh模型进行观察。具体来说,在QAM调制器之后添加一个非线性模块,使调制后的波形经历AM / AM和AM / PM转换。 在Saleh模型中,转换用四个参数表示,即AM / AM转换为????a和????a,AM / PM转换为????p和????p。 在Saleh模型中,AM / AM和AM / PM方程以输入电压u的大小表示为: 式中,FAM / AM是AM / AM转换的输出电压与输入电压的关系,而FAM

太阳帅帅的博客 2080

YOLOv8魔改网络后训练全零?别慌,关掉AMP混合精度训练试试

本文探讨了YOLOv8魔改网络后训练出现全零指标的问题,指出AMP混合精度训练与自定义网络结构的不兼容性。通过分析梯度消失现象和AMP工作原理,提供了关闭AMP、调整学习率等解决方案,并建议预防性开发实践以避免类似问题。

weixin_28338005的博客 321

区间DP总结

区间dp基础:石子合并; 环形区间dp:环形石子合并、能量项链、凸多边形的划分(数组高精度) 区间dp求方案:加分二叉树 二维区间dp:棋盘分割

weixin_68738523的博客 1225

运维系列【仅供参考】:微信版本过低 使用CheatEngine绕过

微信版本过低 使用CheatEngine绕过

weixin_54626591的博客 2133

算法:区间dp

区间dp就是在区间上进行动态规划,求解一段区间上的最优解;该问题的求解思路主要是通过合并小区间的最优解进而得出整个大区间上最优解的dp算法。

m0_74310050的博客 725

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

区间dp问题

区间dp问题区间DP概念思路+模板例题1.石子合并直线版NOI1995 石子合并 参考: 区间DP题型总结 全网最最最最最详细的区间dp题目总结!! https://blog.youkuaiyun.com/noiau/article/details/72514812 区间DP概念 区间DP是线性DP的扩展,分阶段地划分问题,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。 状态转移方程: dp[i][j]=min{dp[i][k]+dp[k+1][j]}+cost[i][j] 或者 dp[i][j]=

selfsongs 1302

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

入门普通区间DP和环形区间DP

具体的更新方式为:f[i][j] = max(f[i][j], f[i][k] + f[k + 1][j] + v[i] * v[k + 1] * v[j + 1]),其中 f[i][k] 表示区间 [i,k] 的最优解,f[k + 1][j] 表示区间 [k+1,j] 的最优解。例如f [i] [j]为区间[l,r]的最大价值,则f [i] [j] = max(f[i] [k] + f[k + 1] [r] + cost | l<=k < r)对于每一个区间,枚举所有可能出现的两个子区间的组合。

estiny_123123的博客 731

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

区间DP题型总结

一. 概念灌输 区间DP是线性DP的扩展,分阶段地划分问题,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。 状态转移方程: 区间DP的特点: (1)合并:即将两个或多个部分进行整合,当然也可以反过来。 (2)特征:能将问题分解为能两两合并的形式。 (3)求解:将整个问题舍最优值,枚举合并点,将问题分解为左右两个部分,最后合并的两个部分的最优值得到原问题的最优值。 ...

fighting_yifeng的博客 1028

D4——区间DP

f[i][j]=第i堆到第j堆石子和并的最高分k]+f[k+1范围k>=i;k<j。

XuyuxuanAa的博客 946

区间dp的总结

1、区间dp含义 区间dp 常用dp[i][j] 来表示,含义是在区间[i,j]之间最大的…或是否可以成功。这里提供以下三个题来熟悉区间dp。 2、经典区间dp问题,合并果子  现在设有n堆的果子,每堆果子根据果子数量的不同需要耗费不同的体力,现在想把这些果子有次序的合并为一堆,消耗的体力等于两堆果子的重量之和。现在求耗费的最小的体力数多少。 比如 5 8 9 3 5+8=13 消费13体力 13 9 3 9+3=12 消费12体力 13 12 13+12=25 消费25体力 总体力消耗为 13

weixin_43688483的博客 955

区间 DP 详解

区间动态规划(Interval dynamic programming,即区间 DP)常用来解决一段区间内的最优解。区间 DP 类似于其他 DP,由多个子区间的答案合并为一个大区间的答案。一般是先求出最小子区间的答案(如dpii​),然后逐步进行合并得到最终答案。区间 DP 一般可分为两种情况:子区间lr向周围两端扩散,一般其时间复杂度为On2。。lr多个小区间的答案合并为一个大区间,时间复杂度通常在On3及以上。。

ATION001的博客 1243

区间DP

区间DP 指一个序列上的问题,可以通过将区间分割更小的区间进行求解,在合并得到答案! 这类问题,有模板,但是题目的思维难度很大!切割多数从首尾切割,很多题目会迷惑你从中间开始, 通常模板:     ·区间长度len:1->N     ·区间首下标i:1->N-len+1     ·区间[i,N-len+1]: 挑选(i,N-len+1)中每一个k将其化为[i,k]和[k+1,N

long1的博客 313
上一篇: BZOJ刷题指南
下一篇: POJ题目难易总汇
Modestr-E·X·L
博客等级 码龄7年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值