题解 P1854 花店橱窗布置
把二维压成一维的DP了解一下。。。
(以纪念神经兮兮调了两天的一维DP(刷水题谋财害命)以及感谢学长的帮助@ydnhaha)
显然我们有二维的dp:f[i][j]代表第i盆花放到第j个位置
for(R i=;i<=n;i++)
for(R j=V-(n-i);j>=i;j--)
for(R k=j-;k>=i-;k--)
if(f[i][j]<f[i-][k]+w[i][j])
ans[i][j]=k,f[i][j]=f[i-][k]+w[i][j];
由于只访问上一个状态,我们可以理所应当的把它压掉
注意,需要倒序循环(好吧我的二维的也是倒序的QWQ)
for(R i=;i<=n;i++) for(R j=V-(n-i);j>=i;j--) {
f[j]=0xcfcfcfcf;
for(R k=j-;k>=i-;k--) if(f[j]<f[k]+w[i][j]) ans[i][j]=k,f[j]=f[k]+w[i][j];
}
时间复杂度不变但是空间小了一些?
AC代码
二维的:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define R register int
using namespace std;
int n,V,pos=;
int w[][],f[][],ans[][]; inline void print(int i,int j) {
if(!i) return ;
print(i-,ans[i][j]);
printf("%d ",j);
} signed main() {
//freopen("testdata.in","r",stdin);
memset(f,0xcf,sizeof(f));
scanf("%d%d",&n,&V);f[n][]=0xcfcfcfcf;
for(R i=;i<=n;i++) for(R j=;j<=V;j++) scanf("%d",&w[i][j]);
for(R i=;i<=V;i++) f[][i]=;
for(R i=;i<=n;i++) for(R j=V-(n-i);j>=i;j--)
for(R k=j-;k>=i-;k--) if(f[i][j]<f[i-][k]+w[i][j]) ans[i][j]=k,f[i][j]=f[i-][k]+w[i][j];//,cout<<i<<" "<<j<<" "<<k<<" "<<f[1][1]<<endl;
for(R i=V;i>=n;i--) if(f[n][i]>f[n][pos]) pos=i;
printf("%d\n",f[n][pos]),print(n,pos);
}
一维的:
(其实一维的有点像01背包对吧)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define R register int
using namespace std;
int n,V,pos=;
int w[][],f[],ans[][]; inline void print(int i,int j) {
if(!i) return ;
print(i-,ans[i][j]);
printf("%d ",j);
} signed main() {
//freopen("testdata.in","r",stdin);
//memset(f,0xcf,sizeof(f));
scanf("%d%d",&n,&V);f[]=0xcfcfcfcf;
for(R i=;i<=n;i++) for(R j=;j<=V;j++) scanf("%d",&w[i][j]);
//for(R i=0;i<=V;i++) f[0][i]=0;
for(R i=;i<=n;i++) for(R j=V-(n-i);j>=i;j--) {
f[j]=0xcfcfcfcf;
for(R k=j-;k>=i-;k--) if(f[j]<f[k]+w[i][j]) ans[i][j]=k,f[j]=f[k]+w[i][j];//,cout<<i<<" "<<j<<" "<<k<<" "<<f[1][1]<<endl;
}
for(R i=V;i>=n;i--) if(f[i]>f[pos]) pos=i;
printf("%d\n",f[pos]),print(n,pos);
}
2019.3.3
题解 P1854 花店橱窗布置的更多相关文章
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- 洛谷 P1854 花店橱窗布置 题解
Analysis 给定一个f*v的矩阵 要求从第一行走到第f行,每行取走一个数, 且该行所取的数必须必上一行所取的数的列数大 , 求所能取走的最大值 注意每一行所取走的数字的列数必须大于等该行的行号 ...
- 洛谷 P1854 花店橱窗布置 【dp】
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- 洛谷 P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- [动态规划]P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- luogu P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- 【Luogu】P1854花店橱窗布置(DP)
照例良心题目链接 此题使用f[i][j]表示前i束花放进前j个花瓶的时候的最大值.转移方程如下 f[i][j]=max(f[i][j-1],f[i-1][j-1]+que[i][j]) 其中que[i ...
- 洛谷P1854 花店橱窗布置
题目 DP,直接递推比记忆化搜索简单. 定义状态\(dp[i][j]\)为前i行最后一个选择第i行第j个数所得到最大值. 易得状态转移方程 \(dp[i][j]=max(dp[i-1][k]+a[i] ...
- [IOI1999]花店橱窗布置(DP路径记录)
题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...
随机推荐
- DBA日记:一次reboot导致的严重失误
昨天下午,一现场要添加RAC节点,db1节点正常运行,添加db2节点:在db2上做了安装的一些配置后,需要reboot, 于是直接就reboot:糟糕,这条命令错误地执行在db1上了,导致现场数据库直 ...
- leetcode 229. Majority Element II(多数投票算法)
就是简单的应用多数投票算法(Boyer–Moore majority vote algorithm),参见这道题的题解. class Solution { public: vector<int& ...
- 浅析linux 下shell命令执行和守护进程
执行shell脚本有以下几种方式 1.相对路径方式,需先cd到脚本路径下 [root@banking tmp]# cd /tmp [root@banking tmp]# ./ceshi.sh 脚本执行 ...
- 注意!!一定要谨慎使用c/c++原生指针
使用指针,要非常小心,今天在做一个小游戏时,就碰到一个使用原生指针的问题,找了好几个小时,才定位到问题的所在,晕. 主要是顶层逻辑中引用了一个指针,而在业务逻辑中将此指针删除了.这种在代码量很少的情况 ...
- aoj 0033 玉
図のように二股に分かれている容器があります.1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし.左の筒 B か右の筒 C に玉を入れます.板 D は支点 E を中心に左右 ...
- 【Lintcode】088.Lowest Common Ancestor
题目: Given the root and two nodes in a Binary Tree. Find the lowest common ancestor(LCA) of the two n ...
- 【LeetCode】062. Unique Paths
题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- 洛谷P2014——选课
题目:https://www.luogu.org/problemnew/show/P2014 树状DP,注意枚举当前子树中选几个时的边界. 代码如下: #include<iostream> ...
- selenium上传文件,怎么操作
#通过os.path.abspath()方法,打开图片的绝对路径,然后,定位上传按钮,然后,send_keys()方法中,添加这个文件路径就可以了
- mysql create table