当前位置: 首页 > 编程日记 > 正文

2016.4.2 动态规划练习--讲课整理

1.codevs1742 爬楼梯

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

小明家外面有一个长长的楼梯,共N阶。小明的腿很长,一次能跨过一或两阶。有一天,他突发奇想,想求出从最低阶到最高阶共有几种爬楼梯的方案。你帮帮他吧!

输入描述 Input Description

一个整数N。

输出描述 Output Description

一个整数,为方案总数。

样例输入 Sample Input

5

样例输出 Sample Output

8

数据范围及提示 Data Size & Hint

0≤N≤40

#include<iostream>
#include<cstdio>
using namespace std;
long long int a[41];
int n;
int main()
{scanf("%d",&n);if(n==0){cout<<0;return 0;}a[1]=1;a[2]=2;for(int i=3;i<=n;++i)a[i]=a[i-1]+a[i-2];cout<<a[n]<<endl;return 0;
}
一般代码
#include<iostream>
int n;
#include<cstring>
using namespace std;
#include<cstdio>
const int INF=10001;
int a[INF],b[INF],c[INF];
int lena=1,lenb=1,lenc=0;
void count()
{lenc=1;int x=0;while(lenc<=lenb||lenc<=lenb){c[lenc]=a[lenc]+b[lenc]+x;x=c[lenc]/10;c[lenc]%=10;lenc++;}c[lenc]+=x;if(c[lenc]==0)lenc--;return ;
}
void SWAP()
{memset(a,0,sizeof(a));//strcpy(a,b);for(int i=1;i<=lenb;++i)a[i]=b[i];lena=lenb;memset(b,0,sizeof(b));for(int i=1;i<=lenc;++i)b[i]=c[i];
//    strcpy(b,c);lenb=lenc;memset(c,0,sizeof(c));lenc=0;
}
int main()
{scanf("%d",&n);a[1]=1;b[1]=2;for(int i=3;i<=n;++i){count();SWAP();}for(int i=lenb;i>=1;--i)printf("%d",b[i]);return 0;
}
高精度代码

2.codevs1259 最大正方形子矩阵

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

在一个01矩阵中,包含有很多的正方形子矩阵,现在要求出这个01矩阵中,最大的正方形子矩阵,使得这个正方形子矩阵中的某一条对角线上的值全是1,其余的全是0。

输入描述 Input Description

第一行有两个整数n和m(1<=n,m<=1000)。接下来的n行,每行有m个0或1的数字。每两个数字之间用空格隔开。

输出描述 Output Description

只有一个整数,即这个满足条件的最大的正方形子矩阵的边长。

样例输入 Sample Input

4 6

0 1 0 1 0 0

0 0 1 0 1 0

1 1 0 0 0 1

0 1 1 0 1 0

样例输出 Sample Output

3

/*基本思路:统计每个点左上右各有多少个0(除自身以外),找最大正
方形子矩阵的时候,就以值为1的点,判断
他的左上(右上),上,左(右)各有多少个0,取一个小数后
加1,就是以当前这个点为左下角或者右下角的正方形的最大边长。
想法;因为题目中的1对角线是最难处理的,所以就把这个1作为突破口*/
#include<iostream>
using namespace std;
#include<cstdio>
#define N 1001
int n,m;
struct Poi{int l,r,num,ans,up;
};
Poi poi[N][N];
int maxx=-N;
void update()
{for(int i=2;i<=n;++i)/*分别统计左上右各有多少个0*/for(int j=1;j<=m;++j){if(poi[i-1][j].num==0)poi[i][j].up=poi[i-1][j].up+1;}for(int j=2;j<=m;++j)for(int i=1;i<=n;++i){if(poi[i][j-1].num==0)poi[i][j].l=poi[i][j-1].l+1;}for(int j=m-1;j>=1;--j)for(int i=1;i<=n;++i)/*注意不同的寻找for循环的顺序是不同的*/{if(poi[i][j+1].num==0)poi[i][j].r=poi[i][j+1].r+1;}
}
void input()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){scanf("%d",&poi[i][j].num);}update();
}
void countz()/*求左上方的正方形的最大边长*/
{for(int i=1;i<=m;++i)if(poi[1][i].num==1)poi[1][i].ans=1;for(int i=1;i<=n;++i)if(poi[i][1].num==1)poi[i][1].ans=1;for(int i=2;i<=n;++i)/*注意不同的寻找for循环的顺序是不同的*/for(int j=2;j<=m;++j){if(poi[i][j].num==1)poi[i][j].ans=min(min(poi[i][j].l,poi[i][j].up),poi[i-1][j-1].ans)+1;if(poi[i][j].ans>maxx)maxx=poi[i][j].ans;}
}
void county()
{for(int i=1;i<=n;++i)poi[i][m].ans=1;for(int i=2;i<=n;++i)for(int j=m-1;j>=1;--j){if(poi[i][j].num==1)poi[i][j].ans=min(min(poi[i][j].r,poi[i][j].up),poi[i-1][j+1].ans)+1;if(poi[i][j].ans>maxx)maxx=poi[i][j].ans;}
}
int main()
{input();countz();county();printf("%d\n",maxx);return 0;
}
View Code

3. noi 1759:最长上升子序列(nlogn算法)

总时间限制:
2000ms
内存限制:
65536kB
描述
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1a2, ..., aN),我们可以得到一些上升的子序列(ai1ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

你的任务,就是对于给定的序列,求出最长上升子序列的长度。
输入
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
输出
最长上升子序列的长度。
样例输入
7
1 7 3 5 9 4 8
样例输出4
#include<iostream>
using namespace std;
#include<cstdio>
const int INF=10001;
#include<cstring>
const int N=1001;
long long  a[N],c[N],f[N];
int search(int l,int r,int i)/*二分查找*/
{if(l==r) return l;int mid=(l+r+1)/2;if(c[mid]>=a[i]) return search(l,mid-1,i);/*等号加到上面是上升序列*/if(c[mid]<a[i]) return search(mid,r,i);/*等号加到下面是不下降*/
}
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&a[i]);memset(c,127,sizeof(c));long long int  MAX=-INF;for(int i=1;i<=n;++i){f[i]=search(0,i,i)+1;c[f[i]]=min(c[f[i]],a[i]);MAX=max(f[i],MAX);}printf("%d\n",MAX);return 0;
}
View Code

4.1166 矩阵取数游戏2007年NOIP全国联赛提高组时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

【问题描述】
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均
为非负整数。游戏规则如下:
1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;
2. 每次取走的各个元素只能是该元素所在行的行首或行尾;
3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素值*2i,
其中i 表示第i 次取数(从1 开始编号);
4. 游戏结束总得分为m次取数得分之和。
帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

输入描述 Input Description

第1行为两个用空格隔开的整数n和m。
第2~n+1 行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。

输出描述 Output Description

输出 仅包含1 行,为一个整数,即输入矩阵取数后的最大得分。

样例输入 Sample Input

2 3
1 2 3
3 4 2

样例输出 Sample Output

82

数据范围及提示 Data Size & Hint

样例解释

第 1 次:第1 行取行首元素,第2 行取行尾元素,本次得分为1*21+2*21=6
第2 次:两行均取行首元素,本次得分为2*22+3*22=20
第3 次:得分为3*23+4*23=56。总得分为6+20+56=82

【限制】
60%的数据满足:1<=n, m<=30, 答案不超过1016
100%的数据满足:1<=n, m<=80, 0<=aij<=1000

代码:

/*分析:对于区间型DP,f[i][j],一般表示的不是i--j这个区间,而是从该开始延伸j位,这样在for循环中可以方便转移。 
由题意,行与行之间没有关系,可以单独处理一行的问题。
考虑一行数据,
在区间[i..j]中取数可以转化为以下两种情况:
1.先取i,再在[i+1..j]中取; 
2.先取j,再在[i..j-1]中取。
f(i,1)=2*a[i]
f(i,j)=Max{2*f(i+1,j-1)+f(i,1),2*f[i,j-1]+f(i+j-1,1)
注意这里为什么没有题目中要求的2^x呢?因为当你把f[i+1][j-1]一层层推进去的时候,你会发现,其实在这个区间内部的数,会被乘了多次2,这就是题目中要求的后一个取的数比前一项多乘一个2. 
n<=80,须涉及到高精度运算。
位数估算:2^80*a[i]~2^90,十进制下大约27位。 
注意数组f的清零初始化,否则会导致位数错误。 
*/
#include<iostream>
using namespace std;
#include<cstdio>
#define N 1001
#define M 81
int a[M],n,m;
int f[M][M][N],ans[N];
#include<cstring>
void add(int *s,int *t)//s+=t
{int len=max(s[0],t[0]);int i=1;while(i<=len){s[i]+=t[i];s[i+1]+=s[i]/10;s[i]%=10;i++;}if(s[len+1]) len++;s[0]=len;
}
int cmp(int *s,int *t)//t1>t2 fan hui zheng shu
{if(s[0]>t[0]) return 1;if(t[0]>s[0]) return -1;for(int i=s[0];i>0;--i){if(s[i]>t[i]) return 1;if(t[i]>s[i]) return -1;}return 1;
}
void cpy(int *s,int* t )//ba t jia ren s
{memset(s,0,sizeof(s));s[0]=t[0];for(int i=1;i<=t[0];++i)s[i]=t[i];
}
int main()
{scanf("%d%d",&n,&m);int t1[N],t2[N];for(int i=1;i<=n;++i)/*每输入一行就处理一行*/{memset(a,0,sizeof(a));memset(f,0,sizeof(f));for(int j=1;j<=m;++j){scanf("%d",&a[j]);//a[j]*=2;int len=1;for(len=1;a[j];++len){f[j][1][len]=a[j]%10;a[j]/=10;}/*注意点一:这里不能用add(f[j][1],f[j][1]),因为传入子函数中的是s,t虽然是相加,但是因为指针指的的是同一个地址,那么加的过程中,不仅s在变化,t也在变化,那就是不是我们想要的加法了;*/f[j][1][0]=len;cpy(t1,f[j][1]);add(f[j][1],t1);memset(t1,0,sizeof(t1));}for(int l=2;l<=m;++l){for(int j=1;j+l-1<=m;++j){memset(t1,0,sizeof(t1));memset(t2,0,sizeof(t2));add(t1,f[j+1][l-1]);add(t1,f[j+1][l-1]);add(t1,f[j][1]);/*动态规划方程不一定有相应的简短的形式*/add(t2,f[j][l-1]);add(t2,f[j][l-1]);add(t2,f[j+l-1][1]);if(cmp(t1,t2)>0)/*strcmp,和strcpy只适用于字符串,而不是用于int数组*/cpy(f[j][l],t1);else cpy(f[j][l],t2);}}add(ans,f[1][m]);}for(int i=ans[0];i>0;--i)printf("%d",ans[i]);printf("\n");return 0;
}
View Code

转载于:https://www.cnblogs.com/c1299401227/p/5346855.html

相关文章:

matlab 通过矩阵变换使图像旋转平移_图像的几何变换

学习图像中的仿射变换(affine transform), 这是一种线性变换&#xff08;涵盖旋转&#xff0c;平移&#xff0c;错切(shear), 缩放等线性变换&#xff09;&#xff0c;既然是线性变换则可以通过线性变换&#xff08;矩阵&#xff09;来获得。仿射变换矩阵M为2*3的矩阵。仿射变换…

用伪代码模拟洗衣机的运转流程

今天的软导课又学到了不少“骚操作”&#xff0c;其中就包括Pseudocode和Top-down design。 不如现在就借着介绍洗衣机的运转流程向大家介绍一下这两个简单的东西。 题目如下 仔细观察您洗衣机的运作过程&#xff0c;运用Top-down设计方法和Pseudocode 描述洗衣机控制程序。 假…

使用 PHP 在站点上构建类似 Twitter 的系统

2019独角兽企业重金招聘Python工程师标准>>> 如果您曾经留意过&#xff0c;就会知道 Twitter 是 Web 2.0 世界最大的轰动事件之一。简单来说&#xff0c;Twitter&#xff08;Twitter.com 上提供的一个服务&#xff09;是一个简单的微博客服务&#xff0c;用户可以发…

Python中的变量以及赋值语句

列表的拷贝区别。 就是在Python中的任何的变量只是一个单纯的名字。名字只是数据的一个贴纸&#xff0c;名字可以来回的变动 赋值语句&#xff1a; 变量就像临时的“存储器”&#xff08;就像厨房中的锅碗瓢盆&#xff09;&#xff0c;它的强大之处就在于&#xff0c;我们在操…

UE4制作程序背景游戏 Make a game with Procedural Backgrounds in UE4

使用虚幻引擎4蓝图创建一个程序背景的游戏 你会学到什么 学习虚幻引擎4要领 使用程序切片创建标高 保存并加载某些游戏元素 创造一个无止境的跑步者角色 创建和完成游戏的良好习惯和实践 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英…

android pop3与imap方式接收邮件(javamail)

需要下载3个jar包&#xff1a;mail.jar/ activation.jar/ additionnal.jar 1.pop3/** * 以pop3方式读取邮件&#xff0c;此方法不能读取邮件是否为已读&#xff0c;已经通过测试 * */ private void getEmail() { List<Map<String, Object>> list new A…

什么是条件组合覆盖_物史政组合分析,新高考最终受益者丨选科17期

导读&#xff0c;规划物理历史政治是新高考33模式下存在的选科组合&#xff0c;为了给马上面临选科问题的高一、高二考生提供有效帮助&#xff0c;自主选拔在线选科模型解读第17期就来分析一下该组合的学科特性、适合人群、优势劣势、专业覆盖及往年选考情况。说明&#xff1a;…

进击时代!王雪红的谦卑与坚守

节前&#xff0c;HTC董事长王雪红发表了一封内部信&#xff0c;王雪红在心中表示&#xff0c;2015年&#xff0c;HTC不仅要在质量、创新能力与工作效率方面更进步&#xff0c;并表示&#xff0c;“我们未来企业成长的动能不仅包含智能手机&#xff0c;还会加入新的领域如RE、虚…

Python中的过滤器

寄语&#xff1a;新的有一天&#xff0c;开始了&#xff0c;让我们把内心的一些想法都放一放&#xff0c;努力去学习吧。 《Python基础教程&#xff08;第2版&#xff0c;修订版&#xff09;&#xff09;》 Assignment 赋值 Variable 变量 Nan是一种特殊的简写 not a numb…

UE4材质着色器全面学习教程

你会学到什么 通过所有着色器类型和设计的实际演示&#xff0c;学习创建材质 要求 对虚幻的基本理解会有所帮助 了解纹理的一般知识(不仅限于UE4)也很有用 描述 在这个系列中&#xff0c;我将带你设置大量不同的材料&#xff0c;教你如何以实用的方式使用虚幻4材料系统。我们…

codeforces #310 div1 C

操作无论是U还是L&#xff0c;都会使原图形分裂成两个图形&#xff0c;且两个图形的操作互不影响 我们又发现由于操作点只可能在下斜线上&#xff0c;如果将操作按x排序 那么无论是U还是L&#xff0c;都会将操作序列完整分割成两半&#xff0c;且两个操作序列互不影响 这样我们…

硬盘温度70度正常吗_70多岁老年人原来血压160,现在130正常吗?医生为你分析实情...

70多岁的老年人&#xff0c;原来有高血压&#xff0c;高压160左右&#xff0c;现在是130左右&#xff0c;正常吗&#xff1f;这个问题问的太过笼统&#xff0c;我们只好通过这个问题&#xff0c;来分享一些老年高血压患者血压控制的一些知识点&#xff0c;希望能够对老年人的高…

使用python愉快地做高数线代题目~

今天接触到了python&#xff0c;发现真是极易上手啊&#xff01;对比c语言是什么鬼东西 诶&#xff0c;等下&#xff0c;看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了&#xff0c;觉得c语言真的是废材! 不。。。不是的。。。python 基础库几乎都…

Docker总结

2019独角兽企业重金招聘Python工程师标准>>> 查看docker的子命令&#xff0c;直接敲docker或完整的docker help就可以了: bash-3.2$ docker Usage: docker [OPTIONS] COMMAND [arg...] A self-sufficient runtime for linux containers. Options:-D, --debugfalse …

Python中的对象,类,super()函数

对象&#xff1a;&#xff08;1&#xff09;外观的特征 &#xff08;2&#xff09;正在做的事情 比如&#xff1a;那个穿蓝色衣服的正在打球的帅哥 类&#xff1a;属性&#xff08;静态的变量&#xff09;方法&#xff08;函数&#xff09;是对对象的近似 类名约定是以大写字…

Blender赛车动画制作学习教程 Learn Race Car Animation with Blender

使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender。免费下载和免费用于任何目的。 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&…

数据结构-线性表的顺序结构

1 #include "stdio.h"2 #include "stdlib.h"3 4 typedef int ElemType; //线性表存储基本类型5 typedef int Status; //基本操作函数类型6 #define LIST_INT_SIZE 50 //线性表初始化存储空间分配量7 #define LISTINCREMENT 10 //线…

项目背景怎么描述_课程游戏背景下幼儿户外活动的组织和实施 ——记岱山县课程项目实施组活动...

课程游戏背景下幼儿户外活动的组织与实施——记岱山县课程项目实施组活动为了深入推进园本化课程实施的实践与研究&#xff0c;加强项目组幼儿园课程的建设与实施&#xff0c;提升项目组幼儿园课程质量。11月23日&#xff0c;县课程项目实施组活动在东沙镇中心幼儿园开展。本次…

兔子生兔子递归的理解

重要的是找规律&#xff01; 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 月份 兔子对数 1 …

美团App首页实现之Category_HeaderView可翻页实现

一。主要实现功能&#xff1a;自定义indicator&#xff0c;侧滑页面切换页面内容&#xff0c;indicator跟着变化&#xff1b;二。实现步奏&#xff1a;1.自定义ViewPagerIndicator①&#xff1a;定义三个不同颜色的画笔②&#xff1a;在画布上画三个静态圆③&#xff1a;改变CX…

爬虫与浏览器的区别,爬虫产生(出自简书)

一篇文章了解爬虫技术现状 - 简书https://www.jianshu.com/p/fbdad6f77d0c 需求万维网上有着无数的网页&#xff0c;包含着海量的信息&#xff0c;无孔不入、森罗万象。但很多时候&#xff0c;无论出于数据分析或产品需求&#xff0c;我们需要从某些网站&#xff0c;提取出我们…

Unity2D游戏开发和C#编程大师班

本课程采用现代游戏开发的最新内容和最新技术(Unity 2D 2022) 学习任何东西的最好方法是以一种真正有趣的方式去做&#xff0c;这就是这门课程的来源。如果你想了解你看到的这些不可思议的游戏是如何制作的&#xff0c;没有比这门课更好的起点了。我们确保本课程具备从初学者(即…

python实训总结报告书_20172304 实验四python综合实践报告

20172304 实验四python综合实践报告 姓名&#xff1a;段志轩 学号&#xff1a;20172304 指导教师&#xff1a;王志强 课程&#xff1a;Python程序设计 实验时间&#xff1a;2020年5月13日至2020年6月14日 实验分析 本次是使用python来进行软件开发&#xff0c;python是一个有很…

Tornado框架

Tornado介绍Tornado 是 FriendFeed 使用的可扩展的异步非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py&#xff08;豆瓣用这个写的&#xff09; 或者 Google 的 webapp&#xff0c;不过为了能有效利用非阻塞式服务器环境&#xff0c;这个 Web 框…

重组系统分区时设置系统盘

在快速分区那里选择另外一个模式&#xff0c;并且只选一个主分区

Javascript:DOM动态创建元素实例应用

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Dom:动态创建元素</title> </head> <body><ul id"demo1"> </ul> <input type"text" id"t…

上帝和面向对象的七天

上帝用7天创造了“面向对象” |【Python之父客串】http://bbs.fishc.com/thread-102596-1-1.html(出处: 鱼C论坛) 第一天&#xff1a; 计算机的诞生使得人类使用汇编语言进行编程&#xff0c;上帝说这个太复杂了&#xff0c;于是将编译的秘密告诉约翰.巴克斯.于是巴克斯创造了…

Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya

准备好开始为游戏制作自己的角色动画了吗&#xff1f; 你会学到什么 了解Maya的界面 优化并准备好你的模型&#xff0c;为游戏做准备 了解关节以及如何使用它们来构建健壮的角色骨骼&#xff0c;以便在任何游戏引擎中制作动画 了解IK和FK系统之间的区别 组织我们的3d场景以获得…

KMP算法简单分析

定义问题 字符串匹配是这样一个问题&#xff1a; 对于两个包含且仅包含字母表∑中的字母的串P&#xff0c;T&#xff0c;计算出所有有效的**移进**s使得P[1..|P|] T[s1..s|P|]。(|P|为P的长度)。 或者说&#xff1a;求出在什么位置P被T完全包含。 为了表达方便&#xff0c;定…