程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 嘟!數字三角形 W WW WWW集合!,ww

嘟!數字三角形 W WW WWW集合!,ww

編輯:C++入門知識

嘟!數字三角形 W WW WWW集合!,ww


哔!數字三角形全體集合!

數字三角形!到!

數字三角形W!到!

數字三角形WW!到!

數字三角形WWW!到!

--------------------------------------------------------------------------------------------------------------------------------------------------------

數字三角形,一個灰常灰常典型的動規題,是一道灰常灰常水的動規題,

1220 數字三角形

 

 時間限制: 1 s  空間限制: 128000 KB  題目等級 : 黃金 Gold   題目描述 Description

如圖所示的數字三角形,從頂部出發,在每一結點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,使路徑上的值最大。

輸入描述 Input Description

第一行是數塔層數N(1<=N<=100)。

第二行起,按數塔圖形,有一個或多個的整數,表示該層節點的值,共有N行。

輸出描述 Output Description

輸出最大值。

樣例輸入 Sample Input

5

13

11 8

12 7 26

6 14 15 8

12 7 13 24 11

樣例輸出 Sample Output

86

 

話不多說上代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110][110]={0},n;
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=i;j++)
			cin>>a[i][j];
	for (int i=n-1;i>=1;--i)
		for (int j=1;j<=i;j++)
			a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);
	cout<<a[1][1];
	return 0;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
重點說的是後三個轉換型的題,我們先跳過 數字三角形W ,先來看數字三角形WW和WWW;
其實這兩道題也是水題,先看題目:

193 數字三角形WW

 

 時間限制: 1 s  空間限制: 32000 KB  題目等級 : 鑽石 Diamond    題目描述 Description

數字三角形必須經過某一個點,使之走的路程和最大

輸入描述 Input Description

第1行n,表示n行
第2到n+1行為每個的權值
程序必須經過n div 2,n div 2這個點

輸出描述 Output Description

最大值

樣例輸入 Sample Input

2
1
1 1

樣例輸出 Sample Output

2

數據范圍及提示 Data Size & Hint

n <=25

 

要求必須經過(n/2,n/2)這個點的話,那我們只需把這個點的值先加上一個較大的數,

最後只需給結果減去你給它加上的值就好了,水題直接上代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110][110]={0},n;
bool f[110][110]={0};
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=i;j++)
			{
				cin>>a[i][j];
			}
	a[n/2][n/2]+=5000;
	for (int i=n-1;i>=1;--i)
		for (int j=1;j<=i;j++)
			a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);
	cout<<a[1][1]-5000;
	return 0;
}

--------------------------------------------------------------------------------------------------------------------------------------------------------

2198 數字三角形WWW

 

 時間限制: 1 s  空間限制: 32000 KB  題目等級 : 鑽石 Diamond    題目描述 Description

數字三角形必須經過某一個點,使之走的路程和最大

輸入描述 Input Description

第1行n,表示n行 
第2到n+1行為每個的權值
第n+2行為兩個數x,y表示必須經過的點

輸出描述 Output Description

最大值

樣例輸入 Sample Input

2
1
1 1
1 1

樣例輸出 Sample Output

2

數據范圍及提示 Data Size & Hint

n<=25

這題思路與WW一樣一樣滴,只是把必走的點變成了(x,y),

上代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110][110]={0},n,x,y;
bool f[110][110]={0};
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=i;j++)
				cin>>a[i][j];
	cin>>x>>y;
	a[x][y]+=5000;
	for (int i=n-1;i>=1;--i)
		for (int j=1;j<=i;j++)
			a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);
	cout<<a[1][1]-5000;
	return 0;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
到了最重點的題:數字三角形W,這個題一開始我並沒有想出較簡單做法,後來敬愛的學哥學姐教會了我,因為畢竟我也是個蒟蒻啊...具體做法在代碼中解釋吧。

2189 數字三角形W

 

 時間限制: 1 s  空間限制: 32000 KB  題目等級 : 黃金 Gold   題目描述 Description

數字三角形
要求走到最後mod 100最大

輸入描述 Input Description

第1行n,表示n行
第2到n+1行為每個的權值

輸出描述 Output Description

mod 100最大值

樣例輸入 Sample Input

2
1
99 98

樣例輸出 Sample Output

99

數據范圍及提示 Data Size & Hint

n<=25

代碼:

//我是用的倒推的思路做的,順推其實思路一樣,轉換一下就好,這裡只給出倒推得代碼
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[26][26]={0};
bool f[26][26][100]={0};
int main()
{
cin>>n;
for (int i=1;i<=n;i++) //數據的讀入
for (int j=1;j<=i;j++)
cin>>a[i][j];
for (int i=1;i<=n;i++) //這一步的代碼是為了將最後一排的所有數存下來
f[n][i][a[n][i]]=true;
for (int i=n-1;i>=1;--i) //這裡是主要過程,思路:將所有的可能性mod100都存下來,
for (int j=1;j<=i;j++)
for (int k=0;k<=99;k++)
{
if (f[i+1][j][k])
f[i][j][(k+a[i][j])%100]=true;
if (f[i+1][j+1][k])
f[i][j][(k+a[i][j])%100]=true;
}
for (int k=99;k>=0;--k) //找出所有可能性中最大的可能,輸出,這個題就AC咯、
if (f[1][1][k])
{
cout<<k;
return 0;
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved