Java练习 SDUT-1149_计算题
2024-10-08 00:46:46
计算题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
一个简单的计算,你需要计算f(m,n),其定义如下:
当m=1时,f(m,n)=n;
当n=1时,f(m,n)=m;
当m>1,n>1时,f(m,n)= f(m-1,n)+ f(m,n-1)
Input
第一行包含一个整数T(1<=T<=100),表示下面的数据组数。
以下T行,其中每组数据有两个整数m,n(1<=m,n<=2000),中间用空格隔开。
Output
对每组输入数据,你需要计算出f(m,n),并输出。每个结果占一行。
Sample Input
2
1 1
2 3
Sample Output
1
7
m,n数据有点大,直接用类可能会超时,但是后台数据有点弱,所以可以过。(其实输入100,100就会超时)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int a,b,t;
t = cin.nextInt();
while(t-->0)
{
a = cin.nextInt();
b = cin.nextInt();
System.out.println(f(a,b));
}
cin.close();
}
public static int f(int m,int n)
{
if(m==1)
return n;
if(n==1)
return m;
return f(m-1,n) + f(m,n-1);
}
}
所以用数组存储的方式来做。
结果发现了一个特别坑的问题,计算结果哪怕开long也会爆……
iimport java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int a,b,t,i,j;
long f[][] = new long [2050][2050];
for(j=0;j<=2000;j++)
f[1][j] = j;
for(i=0;i<=2000;i++)
f[i][1] = i;
for(i=2;i<=2000;i++)
for(j=2;j<=2000;j++)
f[i][j] = f[i-1][j] + f[i][j-1];
t = cin.nextInt();
while(t-->0)
{
a = cin.nextInt();
b = cin.nextInt();
System.out.println(f[a][b]);
}
cin.close();
}
}
最新文章
- doT js 模板引擎【初探】要优雅不要污
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961
- PHP-权限控制类
- 最长公共上升子序列(codevs 2185)
- Spring----->;projects----->;Spring Security
- python学习笔记 - 初识socket
- VI设置及用法
- 圆角button
- JS模板引擎 :ArtTemplate (2)
- C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现
- gearman with postgresql as persistent Queuing
- You-Get , A Tiny Downloader,视频下载小工具
- git pull冲突:commit your changes or stash them before you can merge.
- iOS实现微信外部H5支付完成后返回原APP
- Delphi IfThen语句
- springboot 常用配置文件
- Nginx Windows版的服务安装和管理工具
- SharePoint 2007 页面及用户控件
- Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- Ubuntu 突然上不去网了怎么办