在普及难度考试爆炸之后,小蒟蒻决定从头补DP(从背包开始)
我太弱了,DP都不会
立flag:30T水题DP
T1:P3399 丝绸之路
f [ i ] [ j ] 表示到 i 的位置的第 j 天
然后简单的转移就行
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
f[i][j]=min(f[i][j-1],f[i-1][j-1]+d[i]*c[j]);
for(int i=1;i<=m;++i)
ans=min(ans,f[n][i]);
T2:P2029 跳舞
const int N=5010;
int n,t,s[N],b[N],ans,f[N][N];
int main()
{
n=read(),t=read();
for(int i=1;i<=n;++i)
s[i]=read(),f[i][0]=f[i-1][0]-s[i];
for(int i=1;i<=n;++i)
b[i]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
{
f[i][j]=max(f[i-1][j],f[i-1][j-1]+s[i]);
if(j%t==0&&i!=1)
f[i][j]=max(f[i-1][j]-s[i],f[i-1][j-1]+s[i]+b[i]);
}
for(int i=0;i<=n;++i)
ans=max(ans,f[n][i]);
cout<<ans<<endl;
}
T3:P2079 烛光晚餐
这个题目乍一看有点像个背包,但这里是带负数体积的二维背包
所以我们就草率的平移一下
f [ i ] [ j ] [ k + T ] = m a x ( f [ i - 1 ] [ j ] [ k + T ] , f [ i - 1 ] [ j - v [ i ] ] [ k - v [ i ] + T ] + w [ i ] ) f [ i ] [ j ] [ k + T ] = m a x ( f [ i − 1 ] [ j ] [ k + T ] , f [ i − 1 ] [ j − v [ i ] ] [ k − v [ i ] + T ] + w [ i ] )