dp专练,终于克服了一次自己对dp的恐惧,磕出来一道题。

得分情况:

T1:0

T2:0

T3:0

emmmm,磕出来的题是T2,但是因为初始化和int long long的原因爆零了

T1:n只狼排成一排,每个狼的攻击力分a,b两种,当消灭第i只狼时,需要付出的代价是ai+左右两只狼的b攻击力,消灭i后第i+1和i-1只狼会重新排在一起(如果有的话),求消灭n指只狼的最小代价

很简单的一道区间dp,但是当时我想这个消灭的顺序不一样代价也不一样,所以没想区间dp,直接开始想T2了。

正解:dp[i][j]表示消灭i~j的最小代价,有状态转移方程dp[i][j]=b[i-1]+b[j+1]+min{dp[i][k-1]+dp[k+1][j]};

最后在加上所有的a就行了

T2:求一个正整数N用斐波那契数列中的数不重复表示的方案数。

首先我们要把n分解为斐波拉契数的和,这里用贪心最大分解即可。保存的是斐波拉契数列的序列号。 比如9就分解为1,8序列号为1,5 然后我们注意到其实序列号n,n+1和n+2的分解是一样的,用二进制表示就是110和

001是一样的。 接着我们可以看到,比如1000000这里表示的是数字21贪心后用二进制表示的分解方案,那么他不同的分解方案就有 0110000 0101100 0101011 这里我们看到有三种方案,可以看出在100变成011的方

案的时候,能够使得起始1后面的0都能有变成1的情况,即被选中的情况。 题意要求是用不同的斐波拉契数组合相加,那么如果n的方案为100000000010000000....000001000000这样的时候,随着第一个1的分解,最

终会覆盖到下一个1,这样就不符合题意了切重复统计了。 这样也给dp算法带来了条件。 令dp[i][1]为第i个斐波拉契数列被选中的情况 dp[i][0]则是未被选中。 可知dp[i][1]=dp[i-1][0]+dp[i-1][1]; 那么 dp[i][0]就要分两种情

况了 如果i-1还被选中,那么能给1一直下放为011的空间就只有INDEX[i]-INDEX[i-1]-1的空间了,不然覆盖到了i-1就是重复统计了,如果i-1不被选中就是p[i]-p[i-1]的空间了。 可以知道有多少连续的0的空间k就

有k/2种分解方案。 这样就可以写出方程

dp[i][1]=dp[i-1][0]+dp[i-1][1];

dp[i][0]=(p[i]-p[i-1])/2*dp[i-1][0]+(p[i]-p[i-1]-1)/2*dp[i-1][1];

最后!多组数据一定要初始化!!!数据范围大的记得用long long!!!!!!

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<ctime>
#define LL long long
using namespace std; LL fe[],p[],f[][];
LL m=,T,n; int main(){
freopen("fibonacci.in","r",stdin);
freopen("fibonacci.out","w",stdout); cin>>T;
while(T --> ){
memset(f,,sizeof(f));
memset(p,,sizeof(p));
memset(fe,,sizeof(fe));
scanf("%lld",&n);
fe[]=; fe[]=;
for(int i=;;i++){
fe[i]=fe[i-]+fe[i-];
if(fe[i]>=n){
m=i;break;
}
}
for(int i=m;i>;i--){
if(n>=fe[i]){
n-=fe[i];
p[++p[]]=i;
}
}
sort(p+,p+p[]+);
f[][]=;f[][]=(p[]-)/;
for(int i=;i<=p[];i++){
f[i][]=f[i-][]+f[i-][];
f[i][]=f[i-][]*((p[i]-p[i-]-)/)+f[i-][]*((p[i]-p[i-])/);
}
printf("%lld\n",f[p[]][]+f[p[]][]);
} fclose(stdin);fclose(stdout);
return ;
}

T3:给定n重循环,每重循环的循环变量为前n个小写字母,给定每重循环的上界和下界,其可能是一个数字,也可能是一个循环变量,但是上界和下界只有可能出现一个循环变量,循环最里面写有cnt++,刚开始cnt=0求cnt最后的值

每重循环的上下界至多出现一个之前的字母,所以我们可以考虑把每个字母连向它这层循环上下界所出现的字母(如果上下界没有字母,就连向一个0号节点)。这样形成的就是一个树结构,并且子树之间的循环是独立的,可以用乘法把它们之间的循环次数连接起来。 设g(u,x)表示字母u取值为x时,u的子树的循环次数。再设f(u,x)为g(u,x)的前缀和。求g(u,x)时,考虑u取值为

10-19 dp专练的更多相关文章

  1. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  2. 记502 dp专练

    趁着503的清早 我还算清醒把昨天老师讲的内容总结一下,昨天有点迷了 至使我A的几道题都迷迷糊糊的.(可能是我太菜了) 这道题显然是 数字三角形的变形 好没有经过认真思考然后直接暴力了 这是很不应该的 ...

  3. DP 专练

    A - 跳蚤电话 观察性质,可以发现每次连边的点一定是有祖先关系的,可以直接挂上去一个,也可以是在中间边上插入一个点. 所以我很自然的想到去计算树上的点的加入顺序,因为一但加入顺序确定,每一次的操作也 ...

  4. 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定

    [源码下载] 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定 作者:we ...

  5. Scrum会议10.19

    Scrum会议 组名称:好好学习 项目名称:记账本 参会成员:林莉(Master)胡丽娜 宫丽君 汪东涵 时间:2016.10.19 已完成内容: 1.完成新项目的查找,查找学姐的代码和项目. 2.理 ...

  6. IDC Digital Transition Annual Festival(2018.10.19)

    时间:2018.10.19地点:北京万达文化酒店

  7. 2018.10.19浪在ACM 集训队第一次测试赛

    2018.10.19浪在ACM 集训队第一次测试赛 待参考资料: [1]:https://blog.csdn.net/XLno_name/article/details/78559973?utm_so ...

  8. 20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)

    20172319 2018.10.19 <Java程序设计教程>第7周课堂实践 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  9. P1251 递推专练3

    递推专练3 描述 Description 圆周上有N个点.连接任意多条(可能是0条)不相交的弦(共用端点也算相交)共有多少种方案? 输入格式 Input Format 读入一个数N.<=N< ...

随机推荐

  1. RabbitMQ在windows下的安装

    RabbitMQ 它依赖于Erlang,需要先安装Erlang.首先确定你的window电脑是32位还是64位,以下的安装以window 64位电脑举例.   运行行Erlang/OTP(otp_wi ...

  2. 1.1 Linux中的进程 --fork、孤儿进程、僵尸进程、文件共享分析

    操作系统经典的三态如下: 1.就绪态 2.等待(阻塞) 3.运行态 其转换状态如下图所示: 操作系统内核中会维护多个队列,将不同状态的进程加入到不同的队列中,其中撤销是进程运行结束后,由内核收回. 以 ...

  3. memset,memcpy,strcpy

    http://www.cppblog.com/junfeng568/archive/2006/03/11/4022.html

  4. Fluxbox 添加Qt应用程序menu

    /********************************************************************************* * Fluxbox 添加Qt应用程 ...

  5. 开源库dlib的安装与编译-CMake

    前言 最近项目涉及到关于face alignment的实现,了解到目前主要的算法有ERT.SDM.LBF等,其中由于dlib开源库实现了ERT算法,效果也很不错,故开始研究dlib的使用.而使用的第一 ...

  6. Spring boot 2.1.0 -- swagger2 整合

    依赖版本信息 Spring boot 2.1.0.RELEASE swagger2 2.7.0 1. mvn 配置  pom.xml 包引入 <!--swagger2依赖--> <d ...

  7. HDU 1176:免费馅饼(DP,自认为很详细的解释)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. 51Nod 1009:1009 数字1的数量 (思维)

    1009 数字1的数量  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的 ...

  9. B. Beautiful Paintings

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  10. Python的学习之-计算机编码和二进制

    bit位,计算机中最小的表示单位 8bit = 1bytes字节,最小的储存单位,1bytes缩写为1b 1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 102 ...