简单DP
其中,蜂房的结构如下所示。
Output对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。
Sample Input
2
1 2
3 6
Sample Output
1
3 解题思路:从1-2有1种方法,从1-3可以由1-3或1-2-3,总共2种,由1-4可由1-2-3-4或1-3-4或1-2-4总共3种,可以这样想:想到达4必需到达3或2,然后计算到达3或2的所有路线,加起来就是所有的
路线数,得到递推公式 f(4)=f(3)+f(2);由此可以想到斐波那契数列,不过此题还要注意数据量的大小,每次打表都要注意。
#include<stdio.h>
#define LL long long int
LL dp[];
int main()
{
LL t,i,a,b,ans;
dp[]=;
dp[]=;
for(i=;i<=;i++)
{
dp[i]=dp[i-]+dp[i-];
}
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&a,&b);
ans=dp[b-a+];
printf("%lld\n",ans);
}
return ;
}
2.阿牛和EOF牛肉干
你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?
PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢!
再次感谢!
Output对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input
1
2
Sample Output
3
8 解题思路:这道题师哥作为一道例题来给我们讲,他使用的是二维DP,使用一个二维数组,第一个参数代表动态规划进行到的阶段,第二个参数代表动态规划进行的状态,在这里我们划分了3个状态,分别
是字符为E、O、F。E和F之前的字符可以是E、F、O,而O由于条件的限制不能重复出现,所以关于O的递推公式需要单独拿出来写,O之前只能出现E、F。
#include<stdio.h>
#define LL long long int
LL dp[][];
LL ans[];
int main()
{
LL n,i;
dp[][]=;///
dp[][]=;///E
dp[][]=;///F
ans[]=;
for(i=;i<;i++)
{
dp[i][]=dp[i-][]+dp[i-][];///O不能出现重复,之前的字母只能是E或者F
dp[i][]=dp[i-][]+dp[i-][]+dp[i-][];
dp[i][]=dp[i-][]+dp[i-][]+dp[i-][];
ans[i]=dp[i][]+dp[i][]+dp[i][];
}
while(scanf("%lld",&n)!=EOF)
{
printf("%lld\n",ans[n]);
}
return ;
}
一维DP:最后一个字符只可能有三种情况:E,F,O;最后总的涂法为F(n);当是E的时候倒数第二个字符可以随便涂,因而为此涂法数为:F(n-1);当是F的时候倒数第二个字符也可以随便涂,因而为此涂法数也为:F(n-1);当是O的时候,倒数第二个字符不能随便了,因为连续的2个O是不符合要求的,因此O的时候又被分为二种情况为E或F。在最后2个字符为EO的情况下,倒数第三个字符可以随便,因此此涂法为F(n-2);在最后2个字符为FO的情况下,倒数第三个字符也可以随便,因此此涂法也为F(n-2);此时已经讲所有的情况考虑完毕,F(n)=2*F(n-1)+2*F(n-2);
dp[]=;
dp[]=;
for(i=; i<; i++)
{
dp[i]=*dp[i-]+*dp[i-];
}
3.数塔
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int t,n,i,j;
int a[][];
int dp[][];
scanf("%d",&t);
while(t--)
{
memset(dp,,sizeof(dp));
memset(a,,sizeof(a));
scanf("%d",&n);
for(i=; i<=n; i++)
{
for(j=; j<=i; j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=; i<=n; i++)
{
dp[n][i]=a[n][i];
}
for(i=n-; i>=; i--)
{
for(j=; j<=i; j++)
{
dp[i][j]=max(dp[i+][j],dp[i+][j+]);
dp[i][j]=dp[i][j]+a[i][j];
}
}
printf("%d\n",dp[][]);
}
return ;
}
Output对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2
1
2
Sample Output
2
7
解题思路:
对n取任意值时,分割平面数= 交点数 + 顶点数 + 1,我们假设f(n-1)已知,又f(n)每一条拆线与另一条拆线交点为4,则新加第N条拆线交点数增加4*(n-1)
顶点数比f(n-1)多一个,故f(n)=f(n-1)+4*(n-1)+1
#include<cstdio>
#define LL long long int
LL a[];
int main()
{
LL n,i,t;
a[]=;
a[]=;
for(i=;i<=;i++)
{
a[i]=a[i-]+*(i-)+;
}
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
printf("%lld\n",a[n]);
}
}
简单DP的更多相关文章
- HDU 1087 简单dp,求递增子序列使和最大
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- Codeforces Round #260 (Div. 1) A. Boredom (简单dp)
题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...
- codeforces Gym 100500H A. Potion of Immortality 简单DP
Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...
- 简单dp --- HDU1248寒冰王座
题目链接 这道题也是简单dp里面的一种经典类型,递推式就是dp[i] = min(dp[i-150], dp[i-200], dp[i-350]) 代码如下: #include<iostream ...
- poj2385 简单DP
J - 简单dp Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:65536KB 64bit ...
- hdu1087 简单DP
I - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB ...
- poj 1157 LITTLE SHOP_简单dp
题意:给你n种花,m个盆,花盆是有顺序的,每种花只能插一个花盘i,下一种花的只能插i<j的花盘,现在给出价值,求最大价值 简单dp #include <iostream> #incl ...
- hdu 2471 简单DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571 简单dp, dp[n][m] +=( dp[n-1][m],dp[n][m-1],d[i][k ...
- Codeforces 41D Pawn 简单dp
题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...
- poj1189 简单dp
http://poj.org/problem?id=1189 Description 有一个三角形木板,竖直立放.上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1).每颗钉子和周 ...
随机推荐
- Linux基础命令之文件和目录操作(一)
pwd print working directory的缩写,作用是显示当前工作目录的绝对路径,一般进行频繁切换路径时使用. -L 显示逻辑路径(或略软链接文件),不常用. -P 显示物理路径,不常用 ...
- Git-2.15.1.2-64-bit安装
方法/步骤 我们在百度搜索git,然后在git的官网上找到git的下载页面,如下图所示.在首页在Downloads处选择下载Windows版本,当然您可以根据需求下载其他版本的安装文件. ...
- windows下nginx的安装
一. 下载 http://nginx.org/ (下载后解压) 二. 修改配置文件 nginx配置文件在 nginx-1.8.0\conf\nginx.conf http { gzip on; ...
- 类型“Observable<Response>”上不存在属性“map”
出错提示: angular2 Property 'map' does not exist on type 'Observable<Response>' 类型“Observable<R ...
- Vue.js的小例子--随便写的
1.领导安排明天给同事们科普下vue 2.简单写了两个小例子 3.话不多说直接上代码 <!DOCTYPE html> <html> <head> <meta ...
- Python交换两个变量值的函数
方法1:(错误) def func(a,b): a,b = b,a a = 1 b = 2 func(a,b) print(a," ",b) 方法2:(正确) def func(a ...
- Docker开篇之基础概念篇
What--什么是容器? 容器技术,是一种操作系统层的虚拟化(Operating system-level virtualization),它将应用软件系统打包成一个软件容器(Container),内 ...
- JVM基础知识及拓展
我们可以吧JVM的基本结构分为四块:类加载器.执行引擎.运行时数据区和本地接口.一般来说Java程序在JVM中的执行流程如下: ①.首先我们会利用javac命令将我们所编写的.java源代码文件变异成 ...
- springboot整合kafka应用
1.kafka在消息传递的使用非常普遍,相对于activemq来说kafka的分布式管理和使用更加灵活. 2.activemq的搭建和使用可以参考: activemq搭建和springmvc的整合:h ...
- Redis系列八 使用Jedis
使用Jedis jar操作Redis 1.配置redis.conf文件,修改 2.建java工程,加入 jedis jar包 3.代码示例: package com.ntjr.redis; impor ...