大致題意:
輸入一個n層的三角形,第i層有i個數,求從第1層到第n層的所有路線中,權值之和最大的路線。
規定:第i層的某個數只能連線走到第i+1層中與它位置相鄰的兩個數中的一個。
f[i][j]:表示第 i 行第 j 列到最後一行的最大權值和;
狀態方程:
f[i][j]=w[i][j]+max(f[i+1][j],f[i+1][j+1]);
/ Time 157ms; Memory 1236K // Time 157ms; Memory 1236K[cpp] view plaincopyprint?#include<iostream> using namespace std; int max(int a,int b) { return a>b?a:b; } int main() { int i,j,n,w[355][355],f[355][355]; cin>>n; for(i=0;i<n;i++) { for(j=0;j<=i;j++) cin>>w[i][j]; } for(i=0;i<n;i++) f[n-1][i]=w[n-1][i]; for(i=n-2;i>=0;i--) { for(j=0;j<=i;j++) f[i][j]=w[i][j]+max(f[i+1][j],f[i+1][j+1]); } cout<<f[0][0]<<endl; return 0; } #include<iostream> using namespace std; int max(int a,int b) { return a>b?a:b; } int main() { int i,j,n,w[355][355],f[355][355]; cin>>n; for(i=0;i<n;i++) { for(j=0;j<=i;j++) cin>>w[i][j]; } for(i=0;i<n;i++) f[n-1][i]=w[n-1][i]; for(i=n-2;i>=0;i--) { for(j=0;j<=i;j++) f[i][j]=w[i][j]+max(f[i+1][j],f[i+1][j+1]); } cout<<f[0][0]<<endl; return 0; }