当前位置: 首页 > wzjs >正文

做旅游海报的软件或是网站咸阳网

做旅游海报的软件或是网站,咸阳网,网站制作费一般多少,自己搭建环境建设网站一,开心的金明 题目链接:P1060 [NOIP 2006 普及组] 开心的金明 - 洛谷 本题是一道经典的01背包问题,状态表示和状态定义可以仿照01背包的来。 01背包传送门:【背包问题 】01背包_01背包算法题链接-CSDN博客 dp[i][j]表示从前i个物…

一,开心的金明

题目链接:P1060 [NOIP 2006 普及组] 开心的金明 - 洛谷

 本题是一道经典的01背包问题,状态表示和状态定义可以仿照01背包的来。

01背包传送门:【背包问题 】01背包_01背包算法题链接-CSDN博客

dp[i][j]表示从前i个物品中选,总价值不超过n,并且使得每件物品的价格与重要度的乘积的总和最大。

【代码】

#include <iostream>
#include <cstring>
using namespace std;const int N = 3e4 + 4;
//背包dp
//总钱数,物品个数
int n, m;
int v[30];//每个物品的价格
int p[30];//每个物品的重要度
int dp[30][N];//前i个物品中选,总价值不超过j,使得每件物品的价格与重要度的乘积总和最大
int main()
{cin >> n >> m;for (int i = 1; i <= m; i++)cin >> v[i] >> p[i];for(int i=1;i<=m;i++)for (int j = 1; j <= n; j++){dp[i][j] = dp[i - 1][j];if (j >= v[i])dp[i][j] = max(dp[i][j], dp[i - 1][j-v[i]] + v[i] * p[i]);}cout << dp[m][n] << endl;return 0;
}

二,金明的预算方案

题目链接:P1064 [NOIP 2006 提高组] 金明的预算方案 - 洛谷

本题在上题的基础上,增加了一个限制,选择一个物品,这个物品可能是某个物品的附属品,在选该物品时,必须先买主件。且每个主件最多包含两个附件。

对于每个物品,分为主件和附件两类。且每个主件最多包含两个附件。所以,对于每个物品,会有5种状态

  • 什么都不买
  • 只买主件
  • 可以买一个主件和第一个附件
  • 可以买一个主件和第二个附件
  • 可以买一个主件,第一个附件和第二个附件

然后继续按照背包问题的思路求最大值即可。

思考问题的时候,从主件的位置思考,考虑是否能够买它的附件。题目中说是购买附件时,必须先购买主件,容易让我们从附件的位置考虑问题。


数据处理:

v[i][j]:表示第i个物品的第j个附件的价格

p[i][j]:表示第i个物品的第i个附件的重要度

如果j=0,代表该物品就是主件。

初始化:

int _v,_p,_q;//价格,重要度,附件

如果该物品是主件,也就是p=0,v[i][0]=_v,p[i][0]=_q;

如果该物品是附件,也就是p!=0,那么该物品可能是某个物品的第一个附件,也可能是第二个附件。需要判断:

  • 如果v[_q][1]==0,说明主件的第一个附件为空,那么该物品是第一个主件,v[_q][1]=_v,p[_q][2]=_p。
  • 如果第一个附件有物品,那么该物品就是第二个附件,v[_q][2]=_v,p[_q][2]=_p。

状态表示:

dp[i][j]:表示从前i个元素中选,总价格不超过j,并且使每件物品的价格和重要度的乘积的总和最大。

状态转移方程的推导:

 【代码】

//金明的预算方案-洛谷100
#include <iostream>
#include <algorithm>
using namespace std;const int MaxN = 32000;
//价格和重要度
//第i个物品的第j个附件的价格和重要度
int v[65][3], p[65][3];
int dp[65][MaxN];
//金钱数,物品个数
int n, m;int main()
{cin >> n >> m;for (int i = 1; i <= m; i++){int _v, _p,_q;cin >> _v >> _p >> _q;if (_q == 0)//该物品是主件{v[i][0] = _v;p[i][0] = _p;}else  //该物品是附件,判断是哪一个物品的第几个附件{if (v[_q][1] == 0) //是第一个主件{v[_q][1] = _v;p[_q][1] = _p;}else//是第二个附件{v[_q][2] = _v;p[_q][2] = _p;}}}for(int i=1;i<=m;i++)for (int j = 0; j <= n; j++){dp[i][j] = dp[i - 1][j];//够买主件if (j >= v[i][0])dp[i][j] = max(dp[i][j],dp[i - 1][j - v[i][0]] + v[i][0] * p[i][0]);//购买主件和第一个附件if (j >= v[i][0] + v[i][1])dp[i][j] = max(dp[i][j],dp[i - 1][j - v[i][0] - v[i][1]] + v[i][0] * p[i][0] + v[i][1] * p[i][1]);//购买主键和第二个附件if (j >= v[i][0] + v[i][2])dp[i][j] = max(dp[i][j],dp[i - 1][j - v[i][0] - v[i][2]] + v[i][0] * p[i][0] + v[i][2] * p[i][2]);//购买主件,第一个附件和第二个附件if (j >= v[i][0] + v[i][1] + v[i][2])dp[i][j] = max(dp[i][j],dp[i - 1][j - v[i][0] - v[i][1] - v[i][2] ]+v[i][0] * p[i][0] + v[i][1] * p[i][1] + v[i][2] * p[i][2]);}cout << dp[m][n] << endl;return 0;
}

可以发现,上面的代码dp表达式太长,而且大多数求解的过程都类似。

所以可以通过定义一个函数来解决。同时可以利用滚动数组进行空间优化:

滚动数组传送门: 【背包问题 】01背包_牛客背包问题-CSDN博客

优化后的代码:

 

//简化dp代码部分
//空间优化:使用滚动数组优化
#include <iostream>
#include <algorithm>
using namespace std;const int MaxN = 32000;
//价格和重要度
//第i个物品的第j个附件的价格和重要度
int v[65][3], p[65][3];
int dp[MaxN];
//金钱数,物品个数
int n, m;int main()
{cin >> n >> m;for (int i = 1; i <= m; i++){int _v, _p, _q;cin >> _v >> _p >> _q;if (_q == 0)//该物品是主件{v[i][0] = _v;p[i][0] = _p;}else  //该物品是附件,判断是哪一个物品的第几个附件{if (v[_q][1] == 0) //是第一个主件{v[_q][1] = _v;p[_q][1] = _p;}else//是第二个附件{v[_q][2] = _v;p[_q][2] = _p;}}}for (int i = 1; i <= m; i++)for (int j = n; j >=0; j--){auto cost2 = [i](int x, int y) {return v[i][x] + v[i][y]; };auto cost3 = [i](int x, int y,int z) {return v[i][x] + v[i][y]+v[i][z]; };auto rpp = [i](int x) {return v[i][x] * p[i][x]; };//够买主件if (j >= v[i][0])dp[j] = max(dp[j],dp[j - v[i][0]] + rpp(0));//购买主件和第一个附件if (j >= cost2(0,1))dp[j] = max(dp[j],dp[j - cost2(0,1)] + rpp(0) + rpp(1));//购买主键和第二个附件if (j >= cost2(0,2))dp[i] = max(dp[j],dp[j - cost2(0,2)] + rpp(0) + rpp(2));//购买主件,第一个附件和第二个附件if (j >= cost3(0,1,2))dp[j] = max(dp[j],dp[j - cost3(0,1,2)] +rpp(0) + rpp(1) + rpp(2));}cout << dp[n] << endl;return 0;
}

 三,mari和shiny

题目链接:mari和shiny

本题要求,求出一个字符串的所有子序列中,有多少个是shy???

【动态规划】

首先定义状态表示:(大思路还是以某个位置为结尾,分析状态)

s[i]:表示下标 0-i的子串中 ,包含多少个子序列"s"。

h[i]:表示下标0-i的子串中,包含多少个子序列"sh"。

y[i]:表示下标0-i的子串中,包含多少个子序列"shy"。

状态转移方程的推导:

s[i]:对于第i个位置,有两种状态。

          1,如果s[i]==‘s',那么0-i子串中子序列's'的个数,就是0-i-1子串中子序列 s的个数,再加1,即s[i-1]+1。

 2,如果s[i]!='s',那么0-i子串中子序列’s'的个数,就是0-i-1子串中子序列s的个数,即s[i-1]。

h[i]:对于第i个位置,有两种状态。

          1,如果h[i]==‘h',那么0-i子串中子序列'sh'的个数,就是0-i-1子串中子序列 sh的个数h[i-1],再加上0-i-1子串中s的个数s[i-1],因为s和h可以组合成sh,即s[i-1]+h[i-1]。

 2,如果s[i]!='h',那么0-i子串中子序列’sh'的个数,就是0-i-1子串中子序列sh的个数,即h[i-1]。

y[i]:对于第i个位置,有两种状态。

          1,如果y[i]==‘y',那么0-i子串中子序列'shy'的个数,就是0-i-1子串中 子序列shy的个数y[i-1],再加0-i-1子串中子序列sh的个数h[i-1],即h[i-1]+y[i-1]。

 2,如果y[i]!='y',那么0-i子串中子序列’shy'的个数,就是0-i-1子串中shy的个数,即h[i-1]。

 【代码】

#include <iostream>
#include <string>
using namespace std;
const int N=3e5+10;long long s[N],h[N],y[N];
int n=0;
int main()
{cin>>n;string str;cin>>str;s[0]=str[0]=='s'?1:0;h[0]=y[0]=0;for(int i=1;i<n;i++){s[i]=str[i]=='s'?s[i-1]+1:s[i-1];h[i]=str[i]=='h'?s[i-1]+h[i-1]:h[i-1];y[i]=str[i]=='y'?h[i-1]+y[i-1]:y[i-1];}cout<<y[n-1]<<endl;return 0;
}

空间优化版本:

每次填表的时候,都只会用到上一个值。即求s[i],只会与s[i-1]有关。所以可以使用3个变量来代替三个dp表。

#include <iostream>
#include <string>
using namespace std;
const int N=3e5+10;long long s,h,y;
int n=0;
int main()
{cin>>n;string str;cin>>str;s=str[0]=='s'?1:0;h=y=0;for(int i=1;i<n;i++){if(str[i]=='s')s++;if(str[i]=='h')h+=s;if(str[i]=='y')y+=h;}cout<<y<<endl;return 0;
}


文章转载自:

http://aAz2zPNj.rfdqr.cn
http://ZBIL17wl.rfdqr.cn
http://TmpXWNaV.rfdqr.cn
http://0Rk4ugFd.rfdqr.cn
http://5eBhVnKM.rfdqr.cn
http://Nmrayi5w.rfdqr.cn
http://0W2Y5dYM.rfdqr.cn
http://fYWP8aWX.rfdqr.cn
http://TASDGS1u.rfdqr.cn
http://J4mocNRZ.rfdqr.cn
http://OjnQo9IM.rfdqr.cn
http://sZ9jZeRG.rfdqr.cn
http://wNLoUP6K.rfdqr.cn
http://UN7DPIqt.rfdqr.cn
http://WBq4teRd.rfdqr.cn
http://k8RPNNuo.rfdqr.cn
http://qvdKIXUz.rfdqr.cn
http://noL6OeII.rfdqr.cn
http://liTl8tuM.rfdqr.cn
http://EiJC8RBL.rfdqr.cn
http://rRyvXv13.rfdqr.cn
http://riNjVuUT.rfdqr.cn
http://u1CVgibT.rfdqr.cn
http://z5YbzJF6.rfdqr.cn
http://wrBTXKbJ.rfdqr.cn
http://Gux5Ovvl.rfdqr.cn
http://M1MRNr0o.rfdqr.cn
http://K6JDaHBB.rfdqr.cn
http://YZ4vIDFZ.rfdqr.cn
http://vv0XBbCE.rfdqr.cn
http://www.dtcms.com/wzjs/660364.html

相关文章:

  • 网站建设实训报告ppt页面调用不了wordpress
  • 企业网站一年多少钱帮客户做违法网站违法么
  • 学院网站建设进度情况说明英文网站的外部链接 建设
  • 可以网站可以做免费的文案广告手机优化大师怎么卸载
  • 网站 手机版网站开发合同wordpress图床
  • 自助式网站建设 济南百度ai智能搜索引擎
  • 我想做个网站珠海seo快速排名
  • 自定义表单网站云seo
  • 茂民网站建设投资公司注册经营范围
  • 智慧记免费官方下载排名优化seo公司
  • 网站自己做百度站长工具使用方法
  • 网站建设时怎么附加数据库wordpress 教育插件
  • 建材有限公司光速东莞网站建设个人网站主页html5
  • 莆田网站建设创意上海比较有名的外贸公司
  • 塑胶东莞网站建设技术支持灌云网站建设
  • 深圳旅游公司网站龙采网站建设
  • 网站刷链接怎么做的怀来网站建设
  • eclipse与jsp网站开发西安网站seo 优帮云
  • 网站备案是不是就是空间备案ppt免费模板下载网站有哪些
  • 社交网站 设计科技公司网页图片
  • 企业网站怎么优化销售管理系统业务流程图
  • php企业网站开发教程商标注册网上申请流程25个步骤
  • 做网站卖什么软件设计类专业需要美术功底吗
  • 如何建设万网网站北京学设计去哪个网站
  • 自己做网站页面用php做网站教程
  • 济南高端网站制作公司有专业做淘宝网站的美工吗
  • 建宁建设局网站服务器建站教程
  • 网站的优化 优帮云沙洋网页定制
  • 番禺哪里有做网站的公司平面设计师求职网
  • php网站开发招聘需求企业网站方案