递推java_练习1-递推等

1000 Problem A

时间限制 : 40/20 MS(Java/Others) | 内存限制 : 65536/32768 KB(Java/Others)

Submits : 110 | Solved : 24

题目描述

给定一组无序数值,数值的大小在1到百万之间,数值的个数在10-50万个之间。现需要找出其中第5到第10小的整数。

输入要求

一组非0整数,(个数>=10个),0为结束标志。

输出要求

其中第5到第10小的整数。每输出一个整数换行。

输入样例

1

2

3

4

5

6

7

8

9

10

0

输出样例

5

6

7

8

9

10

// An highlighted block

#include

#include

using namespace std;

int main(){

int a[5000];

int i=0;

int x;

while(cin>>x){

if(x==0) break;

a[i++]=x;

}

sort(a,a+i-2);

for(i=4;i<10;i++){

cout <

}

return 0;

}

1001 Problem B

时间限制 : 2000/1000 MS(Java/Others) | 内存限制 : 65536/32768 KB(Java/Others)

Submits : 55 | Solved : 7

题目描述

对于一个2行N列的走道。现在用12或22的砖去铺满。问有多少种不同的方式(请用递推方式求解)。如果N很大,需要高精度计算。下图是一个2行17列的走道的某种铺法:

d3aefaaebafd3c1e8dc090755782f494.png

输入要求

一个整数N,N<=1000。

输出要求

共有多少种铺法。

输入样例

30

输出样例

715827883

分析

1 大整数的加法用string

2 铺砖问题:

每次铺砖时考虑的情况大致类似,所以可以用递归求解。根据最后剩余的列数,我们将本问题分成两种情况:

A:最后剩余一列,那么假设把这列去掉后,其铺砖情况与n-1时的情况一样,而加上后,也只有一种情况所以方法数位pave(n-1)

B:最后剩余两列,那么把这两列先去掉后和n-2的情况一样,加上这两列后一共有三种情况:12竖着放2列,12横着放,22直接填满。因为12竖着放和A情况重复,所以方法数为pave(n-2)*2

综上:方法总数=pave(n-1)+2*pave(n-2

f9291e525288b33ecaae25b9850fbcc7.png

// An highlighted block

#include

#include

#include

using namespace std;

//用string实现大整数加法

string myadd(string a,string b){

reverse(a.begin(),a.end());//字符串翻转

reverse(b.begin(),b.end());

int len;

if(a.length()>b.length()){

len=a.length(); //记录长的长度

while(b.length()==len) b+=" ";//末尾补齐

}else{

len=b.length();

while(a.length()==len) a+=" ";

}

int i=0,t=0;

string ans;

while(i

t+=a[i]-'0'+b[i]-'0';

ans+=(t%10+'0');//拼接

t/=10;

i++;

}

if(t>0) ans+=t+'0';//进位加上

reverse(ans.begin(),ans.end());

return ans;

}

int main(){

int n;

string dp[1200];

dp[0]="1";

dp[1]="1";

dp[2]="3";

for(int i=3;i<=1000;i++){

dp[i]=myadd(dp[i-1],myadd(dp[i-2],dp[i-2]));

}

while(cin>>n){

cout<

}

return 0;

}

1002 Problem C

时间限制 : 2000/1000 MS(Java/Others) | 内存限制 : 65536/32768 KB(Java/Others)

Submits : 56 | Solved : 11

题目描述

一个N×N的街区,左上角为[1,1],右下角为[N,N],(N<100)。现要求出从左上角到右下角的路径总数,每次只能向下或向右走。

路径中有M个街区有障碍(M<10),不能通过,但不会形成到不了终点的情况。

每条路上的汇总路径数都要对10000取余,以免数据溢出。

输入要求

第一行:两个整数N和M;分别表示街区维度和障碍数;

第二行开始M行:障碍所在的街区。

输出要求

输出满足题意的路径数。

输入样例

3 1

3 1

输出样例

5

f5ca52e1b7753cb4026ed1eefb0e8dc0.png

// An highlighted block

# include

using namespace std;

int dp[101][101]; // 保存走到每个街区的路数

int main()

{

for(int i=0;i<=100;i++)

for(int j=0;j<=100;j++)

dp[i][j] = 1;

int n,m; // 街区的维数和障碍数

cin >> n >> m;

while(m--) // 将每个有障碍的街区置为0

{

int a, b;

cin >> a >> b;

dp[a][b] = 0;

}

for(int i=1; i<=n; i++)

for(int j=1; j<=n; j++)

{

if(dp[i][j] != 0) //不考虑已经被置为0的有障碍的街区

{

if(i==1 && j!=1) // 给第一行街区赋值,不包括初始位置

dp[i][j] = dp[i][j-1];

else if(i!=1 && j==1) // 给第一列街区赋值,不包括初始位置

dp[i][j] = dp[i-1][j];

else if(i!=1 || j!=1) //除初始位置的其他位置

dp[i][j] = (dp[i][j-1] + dp[i-1][j]) % 10000 ; // 每个街区的路径数为左边街区的路径数和上方路径数之和

}

}

cout << dp[n][n] << endl;

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值