又是一个DP 的问题,根本想不到子问题方程,看到答案又觉得很容易= =。、,有时候真的想不到 ,难受 ,只是我们再DP 的过程中观察是否能够飞到那个路线就可以行了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX(a,b) (a)>(b)?(a):(b)
int map[110][110];
int dp[110];
int pre[110];
int inst[110];
void output(int x) {
if (x == -1)
return;
output(pre[x]);
printf("%d->", x);
}
int main() {
int T, n, m;
int i, j, k;
int cases = 1;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (i = 1; i <= n + 1; i++)
for (j = 1; j <= n + 1; j++)
map[i][j] = -1;
memset(dp, 0, sizeof(dp));
for (i = 1; i <= n; i++)
scanf("%d", &inst[i]); //inst[]用于保存各城市的魅力值
inst[n + 1] = 0;//第n+1ge城市即为起点城市
scanf("%d", &m);
for (k = 1; k <= m; k++) {
scanf("%d%d", &i, &j);
/**
* 若城市i、j不连通,则map[i][j]的值为-1,
* 若连通则保存为j城市的魅力值
*/
map[i][j] = inst[j];
}
pre[1] = -1;//城市1的前驱记为-1
for (i = 1; i <= n + 1; i++){
for (j = 1; j < i; j++) {
if (map[j][i] != -1 && dp[j] + map[j][i] > dp[i]) {
dp[i] = dp[j] + map[j][i];
pre[i] = j;//将城市i的前驱记为j
}
}
}
if (cases > 1)
printf("\n");
printf("CASE %d#\n", cases++);
printf("points : %d\n", dp[n + 1]);
printf("circuit : ");
output(pre[n + 1]);
printf("1\n");
}
return 0;
}