09-02 HDU_Steps2.3 遞推,高精度,卡特蘭數 HDU1002 HDU103 HDU1018 HDU1130 HDU1131 HDU1133 HDU1134 HDU1267

來源:互聯網
上載者:User

這幾天一直在做題,沒有抽出時間來寫總結..HDU的Steps做到了第六節了,溫習的一些知識點,也學到了不少新東西..加油,爭取在省賽前能盡量多學一些!!


STEPS 2.3的題目基本都是遞推或者大數,當然這兩者常常是結合在一起的,因為遞推尤其像卡特蘭數之類的,很容易得到一個非常大的數值,一般簡單的只有加法的用CPP就可以了,懶的去啟慢吞吞的Eclipse..當然了,複雜的大數運算還是用JAVA比較好一些,畢竟容易寫,也不會出錯..


2.3.1 HDU1002 A+BⅡ入門大數

主要代碼

for(int i=0;i<l1;i++)i1[i]=s1[l1-i-1]-'0';for(int i=0;i<l2;i++)i2[i]=s2[l2-i-1]-'0'; for(int i=0;g!=0||i<l1||i<l2;i++){ans[i]=(i1[i]+i2[i]+g)%10;g=(i1[i]+i2[i]+g)/10;l3++; }


2.3.2 HDU1063 Exponentiation 高精度冪運算

Java水過,不過要注意幾個方法的調用,去掉末尾和開頭0,並且轉成字串顯示,否則會用預設的科學計數法顯示

import java.math.BigDecimal;import java.math.BigInteger;import java.util.Scanner;public class Main {public static void main(String[] args) {new Main();}public Main(){BigDecimal r;int n;Scanner sc=new Scanner(System.in);while(sc.hasNext()){r=sc.nextBigDecimal();n=sc.nextInt();                        //去末尾0,轉成字串String st=r.pow(n).stripTrailingZeros().toPlainString();int ind=0;while(true){if(st.charAt(ind)!='0')break;ind++;}st=st.substring(ind);System.out.println(st);}}}


2.3.3 HDU1018 Big Number 求N!位元

一個數的位元可以用Log(N)+1得出(底為10),證明很簡單,N可以寫成a*10^n,a為小於10的實數,而N的位元就是n+1

f(N!)=Log(N!)+1=Log(N)+log(N-1)+...Log(1)+1

#include <cstdio>#include <cmath>using namespace std;/*F(N)=log(N)/log(10)+1 數與位元的關係F(N!)=(log(N)+log(N-1)+...+log(1))/log(10)+1 */int solve(int n){double r=0;for(int i=1;i<=n;i++)r+=log(i);return (int)(r/log(10))+1;}int main(){int cas,n;scanf("%d",&cas);while(cas--){scanf("%d",&n);printf("%d\n",solve(n));}}


2.3.4 HDU1130 How Many Trees

樹的個數=左樹的總數*右樹的總數,即d[n]=d[0]d[n-1]+d[1]d[n-2]+....+d[n-1][0] 

卡特蘭數,Java水過,可以求出公式.我沒有求,直接用遞迴寫的.跟記憶化搜尋的思想有些類似

import java.math.BigDecimal;import java.math.BigInteger;import java.util.Scanner;public class Tes {public static void main(String[] args) {new Tes();}//d[n]=d[0]d[n-1]+d[1]d[n-2]+....+d[n-1][0]BigInteger d[]=new BigInteger[105];public Tes(){for(int i=0;i<105;i++){d[i]=new BigInteger("0");}Scanner sc=new Scanner(System.in);while(sc.hasNext()){int n=sc.nextInt();System.out.println(dp(n));}}public BigInteger dp(int n){if(n==0)return g(1);if(d[n].signum()>0)return d[n];for(int i=0;i<=n-1;i++){d[n]=d[n].add(dp(i).multiply(dp(n-i-1)));}return d[n];}public BigInteger g(int x){return new BigInteger(new Integer(x).toString());}public BigInteger gs(String s){return new BigInteger(s);}}


2.3.5 HDU1133 Buy The Ticket 遞推

很經典的一道題,有人說這是卡特蘭數,我也不知道是怎麼用卡特蘭數去解釋,總之我是用遞推做的

d[m][n]=m*d[m-1][n]+n*d[m][n-1] 其中M表示的是前M+N人中50元的個數,N是100元的個數,顯然M+N的狀態可以由M+N-1得來,而加的這個人可能是50元的,也可能是100元的.考慮50元,因為不同的排列算不同的結果,所以加的這個人可以跟前面的M-1個人交換位置,序列是不變的,所以要乘上一個M(加上放在第M+N個位置上的情況)

注意邊界情況,m<n時d[m][n]=0,n=0時f[m][n]=m!

高精度,我是用Java實現的,附上主要代碼


public BigInteger fac(int x){if(x==0)return BigInteger.ONE;return fac(x-1).multiply(g(x));}public BigInteger dp(int m,int n){if(n==0)return fac(m);if(d[m][n]!=null)return d[m][n];d[m][n]=new BigInteger("0");if(m<n)d[m][n]=BigInteger.ZERO;else{if(m>n)d[m][n]=dp(m-1,n).multiply(g(m));d[m][n]=d[m][n].add(dp(m,n-1).multiply(g(n)));}return d[m][n];}public BigInteger g(int x){return new BigInteger(new Integer(x).toString());}

2.3.6 HDU1131 Count the Trees

跟上面的1130是一樣的,只不過要乘上N!


2.3.7 HDU1134 Game of Connections

卡特蘭數 F(n)=F(0)F(n-1)+F(1)F(n-2)+..F(n-1)F(0)


2.3.8 HDU1267 下沙的沙子有幾粒

和上面的1133差不多,只不過不需要考慮排列的情況

所以d[i][j]=d[i-1][j]+d[i][j-1]; d[i][j]=0(i<j) 其中i表示H個數,j表示D個數



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.