數字三角形 1
洛谷 p1216 數字金字塔
我們可以用 f [ i ] [ j ] 表示從(1,1)出發,到達(i,j)的最大權值和。
(i , j)可以由 正上(i - 1 , j)或者 左上(i - 1 , j - 1)轉化來,所以要求這二者的最大值。
轉移方程為:
f [ i ] [ j ] = max ( f [ i - 1 ] [ j ] , f [ i - 1 ] [ j - 1 ] ) + a [ i ] [ j ] ;
邊界為f [ 1 ] [ 1 ] = a [ 1 ] [ 1 ] ; (其實不加也沒關係)
code 1
#include#include變式:數字三角形 2bool f[i][j][k] 走到(i,j),時取模後最大價值為k是否可行#include
#include
#include
#include
#include
using
namespace
std;
inline
intread()
intn;
int f[30][30],a[30][30
];int
main()
code 2
#include#include數字三角形 3你考慮把它轉化一下,因為必須經過(n/2,n/2),很多點都是沒用的#include
#include
#include
#include
#include
using
namespace
std;
inline
intread()
const
int mod=100
;int
n,ans;
int a[30][30
];bool f[30][30][100
];int
main()
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
for(int k=0;k<100;k++)
for(int i=1;i<=n;i++)
for(int k=0;k<100;k++)
if(f[n][i][k])
ans=max(ans,k);
printf("%d
",ans);
}
以自造資料為例
8簡化1 2 7
5 6 9
13 27 66 23
17 55 6 8 9
26 77 8 1 3 6
5 7 4 3 6 3 1
6 6 7 8 2 2 3 7
因為其餘沒用啊,這樣做就保證一定經過點(n/2,n/2)
code 3
#include#include數字三角形 4這個就是推廣了一下上乙個題#include
#include
#include
#include
#include
using
namespace
std;
inline
intread()
const
int mod=100
;int
n,ans;
int a[30][30
];int f[30][30
];int
main()
其實只有下面框下來的這些點有用,其餘沒用的清理成0就好
code 4
#include#include再也不摺疊**了 !#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
intread()
intn,x,y;
int a[30][30],f[30][30],ans=0
;int
main()
for(int i=x+1;i<=n;i++)
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];
for(int i=1;i<=n;i++)
ans=max(ans,f[n][i]);
printf("%d
",ans);
return0;
}
數字三角形 DP
數字三角形 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 問題描述 小hi和小ho在經歷了螃蟹先生的任務之後被獎勵了一次出國旅遊的機會,於是他們來到了大洋彼岸的美國。美國人民的生活非常有意思,經常會有形形色色 奇奇怪怪的活動舉辦,這不,小hi和小ho剛剛下飛機,就趕上了當...
(dp)數字三角形
數字三角形問題。有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行 之外每個數的左下方和右下方各有乙個數 從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數 全部加起來。如何走才能使得這個和盡量大?具體實現 中的d我們用maxsum表示 最初的位置我們用d存 1.把...
數字三角形 dp
給定乙個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。73 8 8 1 0 2 7 4 4 4 5 2 6 5 輸入格式 第一行包含整數n,表示數字三角形的層數。接下來n行,每行包含若干整數,...