[hdu2156]分数矩阵

Problem Description

我们定义如下矩阵:
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。
请求出这个矩阵的总和。

Input

每行给定整数N (N<50000),表示矩阵为 N*N.当N为0时,输入结束。

Output

输出答案,保留2位小数。

Sample Input

1

2

3

4

0

Sample Output

1.00

3.00

5.67

8.83

一看,大水题,马上来了个循环,然后计算 n/2的,得到复杂度O(n/2*n),提上去发现,TLE...我靠!

然后想了想,发现这题可以dp过去.恩....这下子肯定可以过了吧!!!?

dp的过程如下图:

n==2时:

1/1 1/2

1/2 1/1

n==3时:

1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1

容易看出

n==3时,dp[3] = dp[2] - dp[1] + dp[2] + 2*(1/n)

化简一下,推导出:

dp[n]=2*dp[n-1]-do[n-2] + (2/n)

接着快速的敲了Java代码,过了样例,提上去..一个大大的WA!!!!!!!!!!!!!!!!

然后把float改成了double,发现居然是两个不同的答案,再提交一次,还是WA.....(无奈,需要去恶补一下Java的浮点运算)

然后很无奈的换C敲一遍.....就AC了.....无奈无奈无奈

C Code:

#include <stdio.h>
double dp[50001];
int main(){
    int n;
      dp[1]=1;
      dp[2]=3;

      for(int i=3;i<=50000;i++){
          dp[ i ] = 2 * dp[ i - 1 ] - dp[ i - 2 ] + ( 2.0 / i );
    }
    while(scanf("%d",&n)==1 && n){
        printf("%.2lf\n",dp[n]);
    }
}

顺便给上Java的 WA code:

import java.util.Scanner;

public class Main {

    public static double[] dp = new double[ 50001 ];

    public static void dp() {
        dp[ 1 ] = 1;
        dp[ 2 ] = 3;
        for( int i = 3; i <= 50000; i++ ) {
            dp[ i ] = 2 * dp[ i - 1 ] - dp[ i - 2 ] + ( 2.0 / i );
        }
    }

    public static void main( String[] args ) {
        Scanner sc = new Scanner( System.in );
        dp();
        while( sc.hasNext() ) {
            int n = sc.nextInt();
            if( n == 0 )
                return;
            else {
                System.out.printf( "%.2f\n", dp[ n ] );
            }
        }
    }
}

求Java老司机讲解下为何卡浮点呀。。。。

时间: 2024-11-07 12:46:30

[hdu2156]分数矩阵的相关文章

HDU2156 分数矩阵【水题】【递推】

分数矩阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4769    Accepted Submission(s): 2882 Problem Description 我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增. 请求出这个

HDOJ 2156 分数矩阵

分数矩阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4580    Accepted Submission(s): 2769 Problem Description 我们定义如下矩阵:1/1 1/2 1/31/2 1/1 1/21/3 1/2 1/1矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增.请求出这个矩阵的总和.

HDU 2156 分数矩阵

分数矩阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4602 Accepted Submission(s): 2785 Problem Description 我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增. 请求出这个矩阵的总和.

HDUJ 2156 分数矩阵

分数矩阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4305    Accepted Submission(s): 2593 Problem Description 我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增. 请求出这个

HDU_2156 分数矩阵

Problem Description 我们定义如下矩阵:            1/1 1/2 1/3            1/2 1/1 1/2            1/3 1/2 1/1            矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增.            请求出这个矩阵的总和. Input 每行给定整数N (N<50000),表示矩阵为 N*N.当N为0时,输入结束. Output 输出答案,保留2位小数. Sample Input 1 2 3

HDOJ(HDU) 2156 分数矩阵(嗯、求和)

Problem Description 我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增. 请求出这个矩阵的总和. Input 每行给定整数N (N<50000),表示矩阵为 N*N.当N为0时,输入结束. Output 输出答案,保留2位小数. Sample Input 1 2 3 4 0 Sample Output 1.00 3.00 5.67 8.83 简单题 不打表会超时.... 还可

《程序设计技术》课程辅助学习资料

本文档提供课程相关的辅助学习资料. 阅读程序是提高程序设计水平的最为有效的方法,<程序设计技术>课程至少应该阅读后面提供链接博文中的基础部分.能够阅读完基础部分的博文,则可以给课程学习奠定一个坚实的基础. 自己编写程序也是学习编程必不可少的一个环节.自己编写是否正确可以通过OJ系统来验证.选做OJ的程序设计题方便于评价自己所写的程序是否正确.想要提高编写程序的能力并且达到更高的水平,从各个OJ中选做一些编程题是十分必要的. 文中提供了CCF-CSP认证考试历年 试题的第1题的题解.这些题解中都

POJ 1080 Human Gene Functions(求两字符串相似度:LCS变形)

POJ 1080 Human Gene Functions(求两字符串相似度:LCS变形) http://poj.org/problem?id=1080 题意: HDU1080 给你两个由字符A,C,G,T构造的字符串s1和s2, 现在你可以在这两个字符串中插入空格, 使得两串长相等(但是不能使得s1的空格对应s2的空格位置). 然后给你s1的特定字符对应s2中特定字符所能获得的分数矩阵: 问你最后两个字符串所能获得的最大分数是多少? 分析: 本题很类似于求字符串最短编辑距离或者求字符串LCS的

第3课 线性分类器损失函数与最优化

回顾上一节课,我们了解视觉识别,特别是图像分类,这确实是一个非常困难的问题,因为我们必须考虑到这些可能的变化,并使得当我们在识别这些类型时,分类器能够在面对这些变化时具有鲁棒性,例如对猫的识别,似乎存在着难解决的问题,我们仅需要知道如何解决这些问题,同时我们还必须能够在成千上万的其他类型中解决这些问题,而且这种方法能够基本达到甚至是稍微高于人类识别的准确率,这种技术还可能在手机上实时使用,这种技术在近几年开始有重要突破. 这节课时主要讲述了线性分类器的理解方式,包括linearSVM和softm