Forth(背包!动态规则)
Input
Output
Example Input
5 10 1 5 2 4 3 3 4 2 5 1
Example Output
14
01
|
#include<iostream>
|
02
|
#include<cstring>
|
03
|
int max( int a, int b)
|
04
|
{
|
05
|
if (a>b)
|
06
|
return a;
|
07
|
else
|
08
|
return b;
|
09
|
}
|
10
|
using namespace std;
|
11
|
int main()
|
12
|
{
|
13
|
int b[12000];
|
14
|
int n, x, pi[12000], mi[12000], i, j;
|
15
|
while (cin>>n>>x)
|
16
|
{
|
17
|
memset (b, 0, sizeof (b));
|
18
|
for (i = 0;i<n;i++)
|
19
|
{
|
20
|
cin>>pi[i]>>mi[i];
|
21
|
}
|
22
|
for (i=0;i<n;i++)
|
23
|
{
|
24
|
for (j=x;j>=pi[i];j--)
|
25
|
{
|
26
|
b[j] = max(b[j], b[j-pi[i]]+mi[i]);[意思是不买还是等于]
|
27
|
}
|
28
|
}
|
29
|
cout<<b[x]<<endl;
|
30
|
}
|
31
|
return 0;
|
32
|
}
|
背包问题,公式应用。
3684 最近,智商频繁下线的 cyk 迷上了一个益智小游戏,每天都要玩到深夜,乐此不疲。
这个游戏的规则是这样的:
玩家控制一个游戏角色 cyk0 站在一个 n*m 的矩形格子地图上,每个格子都可以提供一定的智力值加成。
初始时 cyk0 位于左上角 (1, 1),游戏的目标是通过走若干步到达位于右下角 (n, m) 的智慧长者 cyk4 处。
沿途走到的格子可以增加相应的智力,到达终点时累积获得的智力就是游戏的得分。
普通玩家的角色每回合只能向右移动或向下移动一次,移动距离为一格。而 VIP 玩家可以在移动角色时选择是否使用主动技能「yk 大冲刺」。「yk 大冲刺」的效果是:使当前回合的移动距离扩大为地图尺寸的一半(向右移动时可以扩大为 m/2,向下移动时可以扩大为 n/2)。此技能是直接移动,中间经过的格子不累计智力值,而且不能越出地图边界,否则本次移动无效。VIP 技能每个回合只能施放一次。
虽然最近 cyk 购买了 VIP,不过他实在是太忙了,每天在实验室待到很晚,并没有太多时间去思考如何才能得到最高分。你能帮助他拿到最高分吗?
Input
第一行输入一个整数 T (0 < T <= 20),代表数据组数。
对于每组输入,首先输入一行,包含两个整数 n, m (0 < n, m <= 1000),表示地图的行数和列数,保证 n, m 不会是奇数。
接下来输入 n 行,每行 m 个以空格分隔的整数 ai (-10^7 <= ai <= 10^7),表示此格子上可提供的智力值。
Output
对于每组输入,输出一行,包含一个整数,代表 cyk 能得到的最高分。
Example Input
2 2 4 1 3 10 8 2 1 2 0 4 4 1 5 3 15 -3 -5 -4 -1 2 4 0 3 9 12 1 6
01
|
#include<bits/stdc++.h>
|
02
|
using namespace std;
|
03
|
#define minlong -10100101010001
|
04
|
long long ma[1100][1100],ai[1100][1100];
|
05
|
int main()
|
06
|
{
|
07
|
int i,t,j,n,m,k;
|
08
|
for (j=1;j<=1010;j++)
|
09
|
{
|
10
|
ma[0][j]=minlong;
|
11
|
ma[j][0]=minlong;
|
12
|
}
|
13
|
ma[0][1]=ma[1][0]=0;
|
14
|
cin>>t;
|
15
|
for (i=1;i<=t;++i)
|
16
|
{
|
17
|
cin>>n>>m;
|
18
|
for (j=1;j<=n;j++)
|
19
|
for (k=1;k<=m;k++)
|
20
|
cin>>ai[j][k];
|
21
|
for (j=1;j<=n;j++)
|
22
|
for (k=1;k<=m;k++)
|
23
|
{
|
24
|
ma[j][k]=max(ma[j-1][k],ma[j][k-1]);
|
25
|
if (j>n/2) ma[j][k]=max(ma[j-n/2][k],ma[j][k]);
|
26
|
if (k>m/2) ma[j][k]=max(ma[j][k-m/2],ma[j][k]);
|
27
|
ma[j][k]=ma[j][k]+ai[j][k];
|
28
|
}
|
29
|
cout<<ma[n][m]<<endl;
|
30
|
}
|
31
|
return 0;
|
32
|
}
|
33
|
对每一回合的理解要正确,没一次都可以使用技能,但是横向跟纵向只能使用一次。并且最上边跟左边边界上的点都应该根据题目的具体要求设置上相应的值若全为正则可以设置为-1,若存在负数应当设定比最下界还小的数。因为边界是为了计算虚幻增加上的,所以后面的值求最大值之后都不会从边界中取数。
Input
Output
Example Input
2 380 200
Example Output
30 0
01
|
#include<bits/stdc++.h>
|
02
|
using namespace std;
|
03
|
int main()
|
04
|
{
|
05
|
int i,t,j,n,k,dp[10010];
|
06
|
int w[3]={150,200,350};
|
07
|
cin>>t;
|
08
|
for (i=1;i<=t;++i)
|
09
|
{
|
10
|
cin>>n;
|
11
|
memset (dp,0, sizeof (dp));
|
12
|
for (j=0;j<3;j++)
|
13
|
for (k=w[j];k<=n;k++)
|
14
|
{
|
15
|
dp[k]=max(dp[k],dp[k-w[j]]+w[j]);[完全背包问题:一定要明确从合法的钱数往后遍历跑循环,例如150,买了之后后面求最大值时只要不到300求出来的最大值依旧是150,之后再跑第二层,如果出现更大的则会覆盖。]
|
16
|
}
|
17
|
cout<<n-dp[n]<<endl;
|
18
|
}
|
19
|
return 0;
|
20
|
}
|
多组背包问题。利用一维数组。
Problem Description
![](http://acm.sdut.edu.cn/image/1730.png)
Input
Output
Example Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Example Output
30
01
|
#include <iostream>
|
02
|
03
|
using namespace std;
|
04
|
05
|
int main()
|
06
|
{
|
07
|
int n,i,j,D[101][101],a[101][101];
|
08
|
cin>>n;
|
09
|
for (i=1;i<=n;i++)
|
10
|
for (j=1;j<=i;j++)
|
11
|
cin>>D[i][j];
|
12
|
for (j=1;j<=n;j++)
|
13
|
a[n][j]=D[n][j];
|
14
|
for (i=n-1;i>=1;i--)
|
15
|
for (j=1;j<=i;j++)
|
16
|
{
|
17
|
if (a[i+1][j]>a[i+1][j+1])
|
18
|
a[i][j]=a[i+1][j]+D[i][j];
|
19
|
else
|
20
|
a[i][j]=a[i+1][j+1]+D[i][j];
|
21
|
}
|
22
|
cout << a[1][1]<< endl;
|
23
|
return 0;
|
24
|
}
|
动态规划就是记录每个点的状态。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
从这个题目中可以看出,01背包的特点就是:每种物品仅有一件,可以选择放或不放。
其状态转移方程是:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
对于这方方程其实并不难理解,方程之中,现在需要放置的是第i件物品,这件物品的体积是c[i],价值是w[i],因此f[i-1][v]代表的就是不将这件物品放入背包,而f[i-1][v-c[i]]+w[i]则是代表将第i件放入背包之后的总价值,比较两者的价值,得出最大的价值存入现在的背包之中。
多组输入。
对于每组输入,第一行有两个整数N,X(1 < = N < = 100,1 < = X < = 1000),分别表示哈士奇的数量和高数巨的钱数
对于每组数据,输出一个整数,表示高数巨最多可以获得的萌值,每组输出占一行
Example Input
2 10050 2060 403 10020 5520 3590 951 1020 50
|
02
|
using namespace std;
|
03
|
int main()
|
04
|
{
|
05
|
int f[1200][1200],n,x,pi[1200],mi[1200],i,j;
|
06
|
while (cin>>n>>x)
|
07
|
{
|
08
|
memset (f,0, sizeof (f));
|
09
|
memset (pi,0, sizeof (pi));
|
10
|
memset (mi,0, sizeof (mi));
|
11
|
for (i=1; i<=n; i++)
|
12
|
cin>>pi[i]>>mi[i];
|
13
|
for (i = 1; i<=n; i++)
|
14
|
{
|
15
|
for (j = 0; j <=x; j++)
|
16
|
{
|
17
|
f[i][j] = f[i - 1][j];
|
18
|
if (j < pi[i]) continue ;
|
19
|
f[i][j] = max(f[i-1][j], f[i-1][j-pi[i]]+mi[i]);
|
20
|
}
|
21
|
}
|
22
|
int ans = 0;
|
23
|
// for (int i = 1; i <= x; i++) ans = max(ans, f[n][i]);
|
24
|
cout<<f[n][x]<<endl;
|
25
|
}
|
26
|
return 0;
|
27
|
}
|
28
|
如果用二维背包需要J(容量)从 0 遍历;而且都每个数组都需要清空
![](/assets/blank.gif)
最长上升子序列
Problem Description
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
Input
Output
Example Input
7 1 7 3 5 9 4 8
Example Output
4
using namespace std;
int main()
{
int n,m,i,k,nmax,a[1010],maxlen[1010];
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
maxlen[1]=1;
for(k=2;k<=n;k++)
{
m=0;
for(i=1;i<k;i++)
{
if(a[k]>a[i]&&m<maxlen[i])
m=maxlen[i];
maxlen[k]=m+1;
}
}
nmax=-1;
for(i=1;i<=n;i++)
if(nmax<maxlen[i])
nmax=maxlen[i];
cout<<nmax;
return 0;
}
最长公共子序列问题
Problem Description
Input
Output
Example Input
ABCBDAB BDCABA
Example Output
4
01
|
#include<bits/stdc++.h>
|
02
|
using namespace std;
|
03
|
int main()
|
04
|
{
|
05
|
int j,i,len1,len2,c[500][500];
|
06
|
char x[500],y[500];
|
07
|
while (cin>>x>>y)
|
08
|
{
|
09
|
len1= strlen (x);
|
10
|
len2= strlen (y);
|
11
|
for (i=0;i<=len1;i++)
|
12
|
c[i][0]=0;
|
13
|
for (j=0;j<=len2;j++)
|
14
|
c[0][j]=0;
|
15
|
for (i=1;i<=len1;i++)
|
16
|
for (j=1;j<=len2;j++)
|
17
|
{
|
18
|
if (x[i-1]==y[j-1])
|
19
|
c[i][j]=c[i-1][j-1]+1;
|
20
|
else
|
21
|
c[i][j]=max(c[i-1][j],c[i][j-1]);
|
22
|
}
|
23
|
cout<<c[len1][len2]<<endl;
|
24
|
}
|
25
|
return 0;
|
26
|
}
|
27
|
一个建立在二维数组的行坐标上,另一个建立在二维数组的列坐标上。
Forth(背包!动态规则)相关推荐
- 一文了解分而治之和动态规则算法在前端中的应用
一文了解分而治之和动态规则算法 一.分而治之 1.分而治之是什么? 2.应用场景 3.场景剖析:归并排序和快速排序 二.动态规则 1.动态规则是什么? 2.应用场景 3.场景剖析:斐波那契数列 4.动 ...
- Sentinel(十三)之动态规则扩展
转载自 动态规则扩展 规则 Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则.Sentinel 提供两种方式修改规则: 通过 API 直接修改 (l ...
- EasyRules动态规则实现
EasyRules动态规则实现 之前写了easyRules的基本使用方法,可以说还是非常方便而且操作也不复杂,个人觉得相较于Drools来说是简便了不少.接下来就需要更深入的了解一下规则的动态使用方法 ...
- flink+drools动态规则示例之温度跳变告警
flink+drools动态规则示例之温度跳变告警 package com.mz.test;import com.google.common.collect.Lists; import lombok. ...
- Flink动态规则实时智能营销系统
视频地址 简单来说,本系统,核心是一个基于事件驱动且可进行动态规则计算的实时系统: 在技术上,它是通用的:本套架构及系统内核,不仅可以用于"实时运营",也可以用于"实时风 ...
- 从零构建FLINK整合Drools动态规则实时运营系统(项目案例)第1篇(项目介绍篇)
1 整体架构 前言 项目介绍在线视频: https://www.bilibili.com/video/BV1zv41157yY 本案例是一个专注于flink动态规则计算的项目,核心技术组件涉及flin ...
- Flink Cep 扩展 - 动态规则更新及Pattern间within()
上一篇文章 <Flink Cep 源码分析>我们可以知道Flink cep中Pattern的创建,state的转换,以及匹配结果的数据.这一篇则对Flink cep的两个痛点进行扩展: 1 ...
- sentinel 1.8. 2持久化Nacos动态规则热点规则和授权规则不生效的问题
sentinel 1.8.2 持久化Nacos动态规则热点规则和授权规则不生效的问题 问题:规则持久化到nacos之后,我在本地测试时候只有热点和授权规则不生效,我慢慢的在客户端sentinel-cs ...
- 从零构建FLINK整合Drools动态规则实时运营系统(项目案例)第2篇(业务介绍篇)
项目简介 本案例是一个专注于flink动态规则计算的项目,核心技术组件涉及flink.hbase.clickhouse.drools等 项目可根据各类个性化需求进行二次开发后,直接用于实时运营,实时风 ...
- uBlock的动态规则过滤规则书写
uBlock具有动态和静态两种规则,但是它比之前的ABP等规则过滤规则强的地方就在于他的动态规则,静态规则的语法继承与ABP,有兴趣的可以去看ABP的过滤规则https://adblockplus.o ...
最新文章
- Win7在IIS7中启用CGI
- Centos7_ELK5.4.1配置部署
- Java中Boolean是什么?
- c++ vlc读取摄像头_Qt音视频开发1-vlc解码播放
- scratch跳一跳游戏脚本_涂鸦骑士3D版强势屠榜,腾讯跳一跳“宝刀未老” | 休闲新游周报...
- masm汇编标号用法总结
- laravel大型项目系列教程(六)之优化、单元测试以及部署
- mysql查询连续3个月以上_MySQL查询显示连续的结果
- aop 获取方法入参出参_Spring AOP 如何将参数传递给需要织入的方法
- java l1 l2缓存,Java 两级缓存框架
- Hadoop2.6分布式集群安装配置
- piblic class 和class的区别
- Cannot overwrite File XXX/xxx/xx/x/x/x.xxx:Permission denied
- 【NLP相关】一些实用的NLP开源项目
- vue组件测试-Vue Test Utils 应用入门
- R语言图形编辑器GUI开发环境RStudio安装(Windows操作系统下、RStudio开发环境安装)
- 《数据结构》专题9--图的遍历DFSBFS
- excel按季度分类汇总_excel数据透视表按月汇总
- 【Linux_SVN忽略文件提交——已经存在仓库里面的文件夹怎么忽略提交】
- 读取Assets中的数据库 .db文件
热门文章
- 关于微信小程序的多选和全选实现
- Realtek 2.5G USB网卡RTL8156B-CG支持免驱简介
- openwrite Test
- Excel 插件使用教程
- Luogu3387 缩点
- java.util.UUID生成32位唯一uuid
- postman的批量传送数据和接口关联
- 我为比尔盖茨熬夜加班的那个晚上
- 单元测试我们需要知道哪些?
- linux怎么读取群辉数据,Linux下读取群晖SHR/RAID硬盘组 Data Recovering of Synology DSM SHR/RAID Volume...