动态规划水题集合

在普及难度考试爆炸之后,小蒟蒻决定从头补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 ] )

猜你喜欢

转载自blog.csdn.net/weixin_43464026/article/details/88421896