例题七:花束摆放问题
1.问题描述
现在有F束不同品种的花束,同时有至少同样数量的花瓶被按顺序摆成一行,其位置固定于架子上,并从1至V按从左到右顺序编号,V是花瓶的数目(F≤V)。花束可以移动,并且每束花用1至F的整数唯一标识。标识花束的整数决定了花束在花瓶中排列的顺序,如果i<j,花束i必须放在花束j左边的花瓶中。每个花瓶只能放一束花。如果花瓶的数目大于花束的数目,则多余的花瓶空置。
题目分析:m束花,n个花瓶,n>=m,对n个花瓶按顺序放置并编号,将m束花放到花瓶中,要求左边花瓶花的号(观赏价值)小于右边
首先通过定义二维数组a[i][j]把所有花的观赏价值输入,原问题的最优值为dp[f,v]
其递归方程为:
S[i,k]=max{S[i-1,k-1]+A(i,k),S[i,k-1]},(i>1,k>i);
#include <iostream>
#include<algorithm>
using namespace std;
int dp[105][105];
int a[105][105];
int main()
{
int n,m;
cin>>n>>m;
int i,j;
for(i=1;i<=n;i++)
for (j=1;j<=m;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for (j=i;j<=m;j++)
{
dp[i][j]=dp[i-1][j-1]+a[i][j];//i=j,
if(j>i)
dp[i][j]=max(dp[i][j],dp[i][j-1]);
}
cout<<dp[n][m]<<endl;
return 0;
}
例题八,复制书稿
假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。
任务:将这M本书分给K个抄写员(K<=M) 每本书只能分配给一个抄写员进行抄写,而每个抄写员所分配到的书必须是连续顺序的。
复制工作是同时开始进
行的,并且每个抄写员复制一页书的速度都是一样的。所以,复制完所有书稿所需时间取决于分配得到最多工作的那个抄写员的复制时间。
试找一个最优分配方案,使分配给每一个抄写员的页数的最大值尽可能小。
哎,题目都那么绕人,看到就晕了。
这题是求最大值的最小值,其实,先不看后面的题目要求,就理解为。有m本书,让k个人去抄写,让你求最短所需时间,那我分配书肯定越平均越好喽,但如果页码不能平均分配,肯定会有一个分到书最多的人,这就是最大值
而不同的分配方案最大值又会不同,要求最短时间,就要求最大值中的最小值。哈哈,这就是最大值最小值的意思
(但是对于代码我没有完全明白,算了,先打过来吧,也方便以后看)
设dp[i][j]表示前i本书由j个人复制所需要的最少时间,有状态转移方程
dp[i][j]=min(dp[i][j],max(dp[v][j-1],sum[v+1][i]))
其中1<=i<=m,1<=j<=k,j-1<=v<=i-1,
sum[v+1][j]表示第v+1本书到第i本书的页数之和
#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX = 510;
int sum[MAX],path[MAX],dp[MAX][MAX];
int main()
{
int m,k,i,j,v,x,p,t;
cin>>x;
while(x--)
{
cin>>m>>k;
for(sum[0]=0,i=1;i<=m;i++)
{
cin>>p;
sum[i]=sum[i-1]+p;
}
memset(dp,-1,sizeof(dp));
for(dp[0][0]=0,i=1;i<=m;i++)
for(j=1;j<=i&&j<=k;j++)
{
if(j==1) dp[i][j]=sum[i];
else
for(v=j-1;v<=i-1;v++)
{
t=max(dp[v][j-1],sum[i]-sum[v]);
if(dp[i][j]==-1||t<=dp[i][j])
dp[i][j]=t;
}
}
cout<<dp[i][j]<<endl;
}
return 0;
}
今天就到这吧,感觉好难啊,难在思路,难在题目理解上,Vj上的题目才做几个,慢慢来吧,奥利给