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

2016.4.2 动态规划练习--讲课整理相关推荐

  1. 2016年诗词曲赋自选集整理过程

    2016年诗词曲赋自选集整理过程 最近,抽空将我的诗词曲赋自选集(2016年)整理成了电子书.下面以此为例,谈谈我对它的整理过程.         1.诗与诗之间保留一个空行.         打开& ...

  2. 动态规划经典题目整理

    动态规划经典题目整理 背包问题 最长公共子串问题 连续数组最大和问题 持续增加中.... 背包问题 复杂度 O(nW)O(nW)O(nW) nnn为物品种类,WWW是背包的重量 目的:使得背包中的物品 ...

  3. dpresult在python中什么意思_动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容--什么是动态规划? 摘录于<算法图解& ...

  4. LeetCode动态规划股票系列整理

    写在前面 股票感觉是LeetCode动态规划中系列最多的一类,交易次数不同,有冷冻期,含手续费,让买卖的最佳时机千奇百怪,但是只要掌握dp的方法,解决起来还是有套路可循的.依据dp的常规思想,股票问题 ...

  5. 动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容–什么是动态规划? 摘录于<算法图解&g ...

  6. 动态规划经典问题整理

    单序列: 最长连续递增序列  最长递增子序列   最长递增子序列的个数  最大子序和   最大整除子集 爬楼梯最长定差子序列  爬楼梯 使用最小花费爬楼梯 比特位计数 旋转数字 把数字翻译成字符串 青 ...

  7. 随笔目录【2016年12月1日整理中~】

    .Net 记录(9) 不用写Windows服务实现定时器功能(FluentScheduler )自定义log日志iis 7.5应用程序池自动停止集合已修改;可能无法执行枚举操作.ADO.NET – 3 ...

  8. 2016年苏州大学872真题整理

    一.数据结构部分 (15分)什么是哈希函数?什么是哈希查找?如何解决冲突?分析影响哈希查找算法性能的因素. 哈希函数:即散列函数,是将查找表中的关键字映射成关键对应的地址的函数. 处理冲突的方法:开放 ...

  9. 年度盘点 | 2016年中国云计算十大新闻

    刚刚离去的2016,有太多值得我们思考与感悟,回顾过去的2016,是为了开启更好的2017.为此,中国软件网针对移动办公.CRM.HR.云计算.大数据.信息安全等细分领域以及软件园区2016年的发展状 ...

最新文章

  1. boost::type_erasure::incrementable相关的测试程序
  2. 边际概率条件概率_数据科学家解释的边际联合和条件概率
  3. php 文件上传mime 类型,PHP JAVA C上传文件如何准确判断文件类型-mime知识普及
  4. 翼虎 android,福特翼虎成首款同时兼容CarPlay和Android Auto的车型
  5. ctf里的拼图工具_CTF比赛工具pwntools介绍
  6. MongoDB与Tokyo Tyrant性能比较(2):并发写入操作
  7. hhvm mysql_Ubuntu 14.10 安装 Nginx + MySQL + HHVM + phpMyAdmin [LNMH]
  8. Unity3D 游戏引擎之构建游戏地形的基本元素(五)
  9. 从Slice_Header学习H.264(二)--片头的子语法项目
  10. 打印准考证服务器异常显示,注意了!打印准考证时,你可能遇到这些问题!
  11. TCPIP详解 习题一
  12. android qq消息推送消息,最新版手机QQ怎么发送定时消息
  13. Chinaitlab技术及认证专题大全[第二辑] 09年8月03日更新
  14. 中国首台超级计算机“天河一号,我国首台超级计算机“天河一号”超负荷运行...
  15. 量子计算机解泊松方程,学界 | 从泊松方程的解法,聊到泊松图像融合
  16. 怎么用万用表检测场效应管的好坏?
  17. 7_文件系统与磁盘分区
  18. POS消费小票(签购单)上的“秘密”
  19. 那些支持我学习与工作的良师益友
  20. 西电计算机学院有保研清华的吗,2021届清华录取保研学生3520余人,本校学生约一半,西电实力强大...

热门文章

  1. 2021-2027年中国手机天线行业竞争格局分析及发展趋势预测报告
  2. 2022-2028年中国新型氟塑料行业市场发展模式及投资机会预测报告
  3. 【C/S语言】.net平台
  4. java 16进制与图片互转
  5. dataframe多列合并成一列
  6. Python isinstance() 函数
  7. TensorFlow与PyTorch模型部署性能比较
  8. 双精度张量内核加快了高性能计算
  9. TensorRT 7.2.1开发初步
  10. 功率半导体碳化硅(SiC)技术