1
从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的数字和最小。
说明
自下向上更新每一层的最小值。
#include <stdio.h>
#include <memory.h>
#define min(a, b) ((a) < (b) ? (a) : (b))
int dp[101], a[101][101];
int main(void)
{
int t, n, i, j;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
memset(dp, 0, sizeof(dp));
for (i = 0; i < n; ++i)
for (j = 0; j <= i; ++j) scanf("%d", &a[i][j]);
for (i = n - 1; i >= 0; --i)
for (j = 0; j <= i; ++j)
dp[j] = min(dp[j], dp[j + 1]) + a[i][j];
printf("%d\n", dp[0]);
}
return 0;
}
2
从第一行的数开始,除了某一次可以走到下一行的任意位置外,每次都只能左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来。如何走,使得这个和尽量大?
说明
数组多建一维,值只有0和1,表示是否还有传送机会剩余。
对于每次更