dp习题2

例题七:花束摆放问题
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上的题目才做几个,慢慢来吧,奥利给

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以按照以下步骤在 Android Studio 中创建一个书单表和一个章节表: 1. 创建一个新的 Android Studio 项目,并添加一个名为 Book 的 Java 类。在该类中定义书的属性,例如书名、作者、出版日期等。同时,也可以在该类中添加一个章节列表作为该书的属性。 2. 创建一个名为 Chapter 的 Java 类,用于定义章节的属性,例如章节名称、页数、内容等。在 Book 类中添加一个章节列表属性,用于存储该书的所有章节。 3. 使用 SQLite 数据库来存储书单和章节信息。在 Android Studio 中创建一个新的 SQLite 数据库,并添加两个表:Book 和 Chapter。在 Book 表中添加书的属性列,并在 Chapter 表中添加章节的属性列。同时,在 Chapter 表中添加一个外键列,将它与 Book 表中的 id 列关联起来,以便能够在两个表之间建立关系。 4. 在 Book 类中添加用于数据库操作的方法,例如添加、更新、删除和查询书的方法。在 Chapter 类中也添加类似的方法,用于操作章节信息。 5. 在 Android Studio 中创建一个界面,用于展示书单信息。使用 RecyclerView 来实现列表展示,并使用 CardView 来展示每本书的详细信息。在界面中添加一个按钮,用于添加新的书籍。 6. 使用 Intent 在界面之间进行跳转。当用户点击某本书时,跳转到该书的章节列表界面,展示该书的所有章节信息。在章节列表界面中,也添加一个按钮,用于添加新的章节。 7. 在章节列表界面中,使用 Intent 跳转到编辑章节的界面。在该界面中,用户可以编辑章节的内容,并保存到数据库中。同时,也可以删除已有的章节。 以上就是在 Android Studio 中创建书单表和章节表的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季沐晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值