1. 程式人生 > >矩陣取數遊戲noip2006(c++ BigInteger的第一次運用)---重點!!

矩陣取數遊戲noip2006(c++ BigInteger的第一次運用)---重點!!

今下午對c++BigInteger進行了初步的瞭解

同時,經過這次,我才深深的體會到了c++的靈活之處

1.對Biginteger的初步認識

2.對c++一些關鍵字的初步認識

3.對vector的一點長進和對這些容器的感覺整體框架加深

4.對operator的認識又加深了

5.熟悉了對c++字串的一些處理

一下將在註釋中標明

<span style="font-size:14px;">#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;

struct BigInteger
{
	static const int base=100000000;//壓位,所要mod的數
	static const int width=8;//每一位佔幾位,這裡是佔8位
	vector<int> s;//便於釋放申請記憶體,但是可以改為陣列來存,c【0】存陣列大小,後面是陣列
	
	BigInteger (long long num=0) {*this=num;}//初始化
	BigInteger operator =(long long num)
	{
		s.clear();//賦值之前要清空
		do
		{
			s.push_back(num%base);
			num/=base;
		}while (num);
		return *this;//????????
	}
	BigInteger operator =(const string &str) //如果有更改,就不能用const
	{
		s.clear();//清空
		int x,len=(str.length()-1)/width+1;//壓位後有多少位
		for (int i=0;i<len;i++)
		{
			int end=str.length()-i*width;//由於陣列是從0開始的,這裡很巧妙
			int start=max(0,end-width);
			sscanf(str.substr(start,end-start).c_str(),"%d",&x);///??? .c_str什麼意思???
			s.push_back(x);
		}
		return *this;//返回值
	}
	BigInteger operator +(const BigInteger &b) const
	{
		BigInteger c;
		c.s.clear();
		for (int g=0,i=0;;i++)
		{
			if (g==0&&i>=s.size()&&i>=b.s.size()) break;
			if (i<s.size()) g+=s[i];
			if (i<b.s.size()) g+=b.s[i];
			c.s.push_back(g%base);
			g/=base;
		}//加法,可以更改的
		return c;//返回值
	}
	BigInteger operator +=(const BigInteger &b)
	{
		*this=*this+b;return *this;//這樣寫
	}
	BigInteger operator *(const BigInteger &b) const 
	{
		BigInteger c;
		c.s.clear();
		for (int i=1;i<=s.size()+b.s.size();i++)c.s.push_back(0);//乘法,先把陣列大小確定
		for (int i=0;i<s.size();i++)
			for (int j=0;j<b.s.size();j++)
			c.s[i+j]+=s[i]*b.s[j];//計算
		for (int i=0;i<c.s.size()-1;i++) 
		{
			c.s[i+1]+=c.s[i]/base;
			c.s[i]=c.s[i]%base;
		}	//進位
		while (c.s.back()==0&&c.s.size()>1) c.s.erase(c.s.end()-1);s.erase()刪除某一位,這裡是刪除最後一位	
		return c;//但是請注意s.end()表示的是最後一位的後面的記憶體地址,由sort中就能看出來,但是最小不能越界,不能小於
	}<span style="white-space:pre">		</span> //1,也就是既然有值,那麼最小就是0,也一定是佔一位的。s.back()表示最後面的數<span style="white-space:pre">	</span>
	
	bool operator < (const BigInteger &b) const
	{
		if (s.size()!=b.s.size()) return s.size()<b.s.size();
		for (int i=s.size()-1;i>=0;i--) 
		if (s[i]!=b.s[i]) return s[i]<b.s[i];
		return false;
	}
	bool operator > (const BigInteger &b) const {return b<*this;}
	bool operator <=(const BigInteger &b) const {return !(*this>b);}
	bool operator >=(const BigInteger &b) const {return !(*this<b);}
	bool operator !=(const BigInteger &b) const {return *this>b||*this<b;}
	bool operator ==(const BigInteger &b) const {return *this>=b&&*this<=b;}//通過一個'<'變換出的其他的這些
	
};
ostream& operator<< (ostream &out,const BigInteger &x) 
{
	out<<x.s.back();//先把最高位輸出,因為最高位不用補0,其他不夠要補0
	for (int i=x.s.size()-2;i>=0;i--)
	{
		char buf[20];//
		sprintf(buf,"%08d",x.s[i]);//為什麼這裡要有08,還有為什麼不能直接輸出?? 
		//突然明白了,因為數字中可能有154000000000000000000000000000999的情況
		//並且我們還要把0給輸出來 %08d的意思是佔8位,不夠的用0補齊,而%8d也是佔8位,不夠的用空格補
		for (int j=0;j<strlen(buf);j++) out<<buf[j];
	}
	return out;
}
istream&/*這個&號不知道什麼用*/ operator >> (istream &in,BigInteger &x)
{
	string s;//輸入
	if (!(in>>s)) return in;
	x=s;
	return in;
}
int n,m;
BigInteger a[100][100],f[100][100];
int main()
{
	BigInteger ans;
	ans.s.clear();//清空
	cin>>n>>m;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++) cin>>a[i][j];
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++)
			for (int l=1;l<=m;l++) f[j][l].s.clear();//剛開始一定要清空
		for (int j=m;j>=1;j--)
			for (int l=j;l<=m;l++) 
			{
				BigInteger k=2,k1=f[j+1][l]+a[i][j],k2=f[j][l-1]+a[i][l];
				if (k1>k2) f[j][l]=k1*k;else f[j][l]=k2*k;
			 }
		ans=ans+f[1][m];	  
	}	
	cout<<ans;
	return 0; 
}</span>


相關推薦

矩陣遊戲noip2006c++ BigInteger第一運用---重點

今下午對c++BigInteger進行了初步的瞭解 同時,經過這次,我才深深的體會到了c++的靈活之處 1.對Biginteger的初步認識 2.對c++一些關鍵字的初步認識 3.對vector的一點長進和對這些容器的感覺整體框架加深 4.對operator的認識又加深了

單詞個數統計函式庫第一運用

編寫程式,實現單詞個數統計。從鍵盤輸入一行字元,長度小於1000。統計其中單詞的個數,各單詞以空格分隔,且空格數可以是多個。輸入要求:輸入只有一行句子。僅有空格和英文字母構成。輸出要求:輸出單詞的個數。 考察字元陣列與字串,基本c語言函式庫的初步應用,迴圈結構

[luoguP1005] 矩陣遊戲DP + 高精度

put ring 分享 tdi pre closed () hide += 傳送門 和奶牛那個題很像,每一行狀態互不影響,也就是求 n 遍DP 不過高精度非常惡心,第一次寫,調了我一上午。 ——代碼 1 #includ

dp+高精度洛谷1005 矩陣遊戲NOIP 2007 提高第三題

結束 efi -m ron highlight std mes c++ brush 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n*m的矩陣,矩陣中的每個元素aij均為非負整數。遊戲規則如下: 1.每次取數時須從每行各取走一個元素,共n個。m次後取完矩陣所有元素;

codevs 1166 矩陣遊戲

bigint else for 封裝 with 好的 push_back lin cassert 二次聯通門 : codevs 1166 矩陣取數遊戲 /* codevs 1166 矩陣取數遊戲 SB區間dp dp[l][

洛谷 P1005 矩陣遊戲

每次 狀態轉移方程 latex 輸出格式 scan 有一個 練手題 開始 define 題目描述 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n*m的矩陣,矩陣中的每個元素aij均為非負整數。遊戲規則如下: 1.每次取數時須從每行各取走一個元素,共n個。m次後取完矩

dp算法第二發之noip矩陣遊戲

space lpad with cell false 空格 memset 文件 urn dp+高精度。希望通過此題了解高精度。 矩陣取數遊戲 (game.pas/c/cpp) 【問題描述】 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n*m的矩陣,矩陣中的每

P1005 矩陣遊戲

main eof std void def 答案 typedef set 輸入輸出 題目描述 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n*m的矩陣,矩陣中的每個元素aij均為非負整數。遊戲規則如下: 1.每次取數時須從每行各取走一個元素,共n個。m次後取完矩陣所有元

NOIp2007 矩陣遊戲

stream class body include 轉移 cstring post out string Luogu 像我這種小蒟蒻怎麽可能會寫高精呢?int128墜好啦 轉移方程太顯然不寫。 #include <cstdio> #include <cst

18.7.27 luogu P1005 矩陣遊戲

輸入輸出 圖片 編號 矩陣 algo != 答案 技術分享 ems 題目描述 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的 n \times mn×m 的矩陣,矩陣中的每個元素 a_{i,j}ai,j? 均為非負整數。遊戲規則如下: 每次取數時須從每

luogu1005矩陣遊戲題解--區間DP

max == turn org ons 區間 getchar https lin 題目鏈接 https://www.luogu.org/problemnew/show/P1005 分析 忽然發現這篇題解好像並沒有什麽意義。。。因為跟奶牛零食那道題一模一樣,博主比較懶如果您想

[P1005][NOIP2007] 矩陣遊戲 (DP+高精)

clu ans ace stdio.h P20 spl 記憶 cin spa 我不會高精…… 也不會DP…… 這道題即考高精又考DP…… 我要死了 給一個不是高精的代碼(當然不能滿分

洛谷P1005 矩陣遊戲

題目描述 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n×m的矩陣,矩陣中的每個元素ai,j​均為非負整數。遊戲規則如下: 每次取數時須從每行各取走一個元素,共n個。經過m次後取完矩陣內所有元素; 每次取走的各個元素只能是該元素所在行的行首或行尾; 每次取數都有一個得分值,為每行取數的得

F: 遊戲III 思維+簡單dp

F: 取數遊戲III 題目描述 小 C 剛學了輾轉相除法,正不亦樂乎,這小 P 又出來搗亂,給小 C 留了個 難題。 給 N 個數,用 a1,a2…an來表示。現在小 P 讓小 C 依次取數,第一個數可以 隨意取。假使目前取得 aj,下一個數取ak(k>j),則ak必須滿足gcd(aj,ak)≥

51Nod 1084 矩陣問題 V2dp降維

一個M*N矩陣中有不同的正整數,經過這個格子,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同一個格子,則該格子的獎勵只計算一次,求能夠獲得的最大價值。   例如:3 * 3的方格。  

矩陣遊戲

https://www.luogu.org/problemnew/show/P1005 /* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #includ

洛谷P1005 矩陣遊戲【記憶化搜尋】

題目描述 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n×mn \times mn×m的矩陣,矩陣中的每個元素ai,ja_{i,j}ai,j​ 均為非負整數。遊戲規則如下: 每次取數時須從每行各取走

矩陣遊戲 noip 2007 [區間DP+高精]

矩陣取數遊戲 題目描述 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n×m的矩陣,矩陣中的每個元素ai,j​均為非負整數。遊戲規則如下: 每次取數時須從每行各取走一個元素,共n個。經過m次後取完矩陣內所有元素; 每次取走的各個元素只能是該元素所在行的行首或行尾;

【提高組NOIP2007】矩陣遊戲

題目描述 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n*m的矩陣,矩陣中的每個元素a[i,j] 均為非負整數。遊戲規則如下: 每次取數時須從每行各取走一個元素,共n個。m次後取完矩陣所有元素; 每次取走的各個元素只能是該元素所在行的行首或行尾; 每次取數都有一個得分值,為每

【日常學習】【區間DP+高精】codevs1166 矩陣遊戲題解

題目來自NOIP2007TG3 如果在考場上我現在已經歇菜了吧 今天一整天的時間全部投在這道題上,收穫不小。 先上題目 題目描述 Description 【問題描述】 帥帥經常跟同學玩一個矩陣取數遊戲:對於一個給定的n*m 的矩陣,矩陣中的每個元素aij均 為非