水一些dp的联系题

标签: dp


hdu_2045

  • 题意

一穿珠子,用三种颜色染色,要求相邻的珠子和两端的珠子不能是同一种颜色,求当有n个珠子的时候有几种染色方案

  • 题解

表示dp[i][j][k] 表示开始位置为k当前i位置为j的最大值

  • 代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
ll dp[55][3][3];//dp[i][j][k] 表示开始位置为k当前i位置为j的最大值 void init()
{
dp[0][0][0] = dp[0][1][1] = dp[0][2][2] = 1;
dp[0][1][0] = dp[0][2][0] = dp[0][0][1] = dp[0][2][1] = dp[0][0][2] = dp[0][1][2] = 0;
for(int i = 1; i < 55; i++){
dp[i][0][0] = dp[i-1][1][0] + dp[i-1][2][0];
dp[i][1][0] = dp[i-1][0][0] + dp[i-1][2][0];
dp[i][2][0] = dp[i-1][1][0] + dp[i-1][0][0]; dp[i][0][1] = dp[i-1][1][1] + dp[i-1][2][1];
dp[i][1][1] = dp[i-1][0][1] + dp[i-1][2][1];
dp[i][2][1] = dp[i-1][1][1] + dp[i-1][0][1]; dp[i][0][2] = dp[i-1][1][2] + dp[i-1][2][2];
dp[i][1][2] = dp[i-1][0][2] + dp[i-1][2][2];
dp[i][2][2] = dp[i-1][1][2] + dp[i-1][0][2];
}
}
int main()
{
init();
int n;
while(~scanf("%d",&n))
{
if(n==1)puts("3");
else
printf("%lld\n",dp[n-1][1][0]+dp[n-1][2][0]+dp[n-1][0][1]+dp[n-1][2][1]+dp[n-1][1][2]+dp[n-1][0][2]);
}
return 0;
}

hdu_1297(大数+递推)

推荐一个对这个题讲解很好的博客:http://blog.sina.com.cn/s/blog_8a24b3a301010nwc.html

下面是这个博客的核心内容:

1.首先,n个人时,假设n个人的组合是合法的,这样的一个合法的组合设为\(f(n)\)

2.为了保证n个人的时候是合法的,讨论一下第n个位置的人的性别

(1)如果第n个人是男性,那么前n-1个人,无论是什么样的组合,显然都是能保证n个人的组合是合法的,所以是\(f(n-1)\)

(2)如果第n个是女性的话,那么第n-1个人的性别必须是女性,这样才能保证n个人的组合是合法的!

然后我们需要考虑前n-2个人在合法与不合法这两种情况下都能使n个人的组合都合法的问题 。

*如果前n-2个人的组合是合法的,那么这个组合为\(f(n-2)\)

*如果前n-2的人的组合是不合法的话,那如果要满足当前的是合法的话,n-1位置一定是F,而且如果是非法的话前面n-2 = F ,n-3 = M 只有这一种情况是可行的。这种情况\(f(n-4)\)就是合法的了。

所以得到的递推公式就是\(f(n)=f(n-1)+f(n-2)+f(n-4)\)

下面是代码:

这里注意一下大数要用java

import java.io.*;
import java.math.*;
import java.util.*;
public class Main
{
public static void main(String []args)
{
Scanner cin = new Scanner(System.in);
Integer N = 1001,i;
BigInteger[] f = new BigInteger[N];
f[1] = BigInteger.valueOf(1);
f[2] = BigInteger.valueOf(2);
f[3] = BigInteger.valueOf(4);
f[4] = BigInteger.valueOf(7);
for(i = 5; i < N; i++){
f[i] = f[i-1].add(f[i-2]).add(f[i-4]);
}
while(cin.hasNext())
{
i = cin.nextInt();
System.out.println(f[i]);
}
}
}

hdu_1159

  • 题意

求最长公共子序列

  • 题解

\(dp[i][j]\)表示第一个字符串扫描到第i 个位置看,第二个字符串扫描到j个位置的最长公共子序列,那么有如果\(s[i]=t[j]\)则满足\(dp[i][j]=dp[i-1][j-1]+1\),否则,有\(dp[i][j] = max(dp[i-1][j],dp[i][j-1])\)

注意两个细节:

1,字符串的编号最好从1开始,这样可以避免初始化字符长度为1的情况。

2,输入的时候数组如果从s+1的地方输入,则求数组长度的时候也要\(len1 = strlen(s+1)\)

下面是代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 1008;
char s[N];
char t[N];
int dp[N][N];
int main()
{
while(cin>>(s+1)>>(t+1)){
int len1 = strlen(s+1);
int len2 = strlen(t+1);
memset(dp,0,sizeof(dp));
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++){
if(s[i]==t[j]) dp[i][j] = max(dp[i-1][j-1]+1,max(dp[i-1][j],dp[i][j-1]));
else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}

hdu_2563

题目很简单直接上代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[25][3];//dp[i][0]表示第i步向上走。。。
void init()
{
dp[0][1] = dp[0][0] = dp[0][2] = 1;
for(int i = 1; i < 25; i++){
dp[i][0] = dp[i-1][0]+dp[i-1][1]+dp[i-1][2];
dp[i][1] = dp[i-1][0]+dp[i-1][1];
dp[i][2] = dp[i-1][0]+dp[i-1][2];
}
}
int main()
{
int T,n;
init();
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",dp[n-1][0]+dp[n-1][1]+dp[n-1][2]);
}
return 0;
}

hdu_2190

题解

dp[i][j]表示当前列有没有2*2的瓷砖

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[35];
void init()
{
dp[0] = 1;
dp[1] = 3;
for(int i = 2; i < 35; i++){
dp[i] = dp[i-1]+2*dp[i-2];//dp[i][j]表示当前列有没有2*2的瓷砖
}
}
int main()
{
int T,n;
init();
scanf("%d",&T);
while(T--){
scanf("%d",&n);
printf("%d\n",dp[n-1]);
}
return 0;
}

hdu_2041

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 50;
int dp[N];
void init()
{
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= N; i++){
dp[i] = dp[i-1]+dp[i-2];
}
}
int main()
{
init();
int T,m;
scanf("%d",&T);
while(T--){
scanf("%d",&m);
printf("%d\n",dp[m]);
}
return 0;
}

dp水一天的更多相关文章

  1. ACM :漫漫上学路 -DP -水题

    CSU 1772 漫漫上学路 Time Limit: 1000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  2. [poj2247] Humble Numbers (DP水题)

    DP 水题 Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The se ...

  3. Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题

    除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...

  4. dp水题 序列问题 (9道)

    9道题.A了8道,A题看题解也没弄懂怎么维护m段子序列的,过一段时间再回来看看     dp试水 47:56:23 125:00:00   Overview Problem Status Rank ( ...

  5. 【BZOJ】1270: [BeijingWc2008]雷涛的小猫(DP+水题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1270 这完全是一眼题啊,但是n^2的时间挺感人.(n^2一下的级别请大神们赐教,我还没学多少dp优化 ...

  6. 【DP水题】投票问题(二)

    投票问题(一) [试题描述] 欧阳文和欧阳武竞选学联主席,汪梁森负责唱票,共有m+n张,结果欧阳文获胜,已知欧阳文和欧阳武分别获得 m 张票和 n 张票(m>n).现在请你计算在唱票过程中欧阳文 ...

  7. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

  8. zzuli1985(dp/水dfs郑轻比赛)

    再一次感受到dp的威力 1985: 即将到来的新生赛 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 112  Solved: 28 SubmitStat ...

  9. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

随机推荐

  1. MongoDB入门系列(二):Insert、Update、Delete、Drop

    概述 本章节介绍Insert.Update.Delete.Drop操作基本语法. 环境: Version:3.4 insert insert()基本语法如下: db.collection.insert ...

  2. boost::assign(标准容器填充库)

    boost::assign通过对"+="和","的重载非常方便的填充标准容器(std::vector,std::set,std::list,std::map), ...

  3. c#中treeview的使用方法(转 )

    本文主要介绍treeView控件中,添加,修改.删除节点的操作, 首先当窗体加载的时候,我们添加上图中所示的节点. 当点击“Delete the Selected”按钮时,被选中的节点将被删除. 当点 ...

  4. JavaWeb之原生数据库连接

    我们在开发JavaWeb项目时,常会需要连接数据库.我们以MySQL数据库为例,IDE工具为eclipse,讲述数据库连接与基本操作. 第一步,我们在Web项目的WebContent中建一个简单的前端 ...

  5. [置顶] xamarin android 布局尺寸了解

    为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接  ...

  6. bzoj 4012: [HNOI2015]开店

    Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...

  7. ElasticSearch 学习记录之ES高亮搜索

    高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...

  8. 从一个word文件中读取所有的表格和标题(1)

    首先讲需求: 从word文件中读表格里的数据,然后插入数据库中.word文件中的表格是带有标题的,把标题读出来,进行匹配数据库. 需求分析: word2007底层是以xml文件存储的,所以分析xml的 ...

  9. 发布 Google Chrome插件教程

    换个视角,世界不一样.嘘~~~ 如果你会使用js的话,那么你就可以自己动手写一个chrome插件,而且非常容易.google是一个全球化的平台,想想自己的程序被世界人民所使用,是不是很激动? 注册开发 ...

  10. 区分javascript中的toString(),toLocaleString(),valueOf()方法

    首先我们随意创建一个对象,这很简单,打开FF浏览器的Firebug切换到控制台或者打开webkit浏览器的审查元素功能. 输入以下内容: var obj1=[1,2,3,4,5] var obj2=[ ...