#include <stdio.h>
#include <stdlib.h>
struct Pair {
int first;
int second;
};
int collectCoin(int** coin, int rowCount, int colCount, struct Pair** path) {
int** dpArray = (int**)malloc((rowCount + 1) * sizeof(int*));
for (int i = 0; i <= rowCount; ++i) {
dpArray[i] = (int*)malloc((colCount + 1) * sizeof(int));
}
for (int i = 1; i <= rowCount; ++i) {
for (int j = 1; j <= colCount; ++j) {
dpArray[i][j] = (dpArray[i - 1][j] > dpArray[i][j - 1]) ? (dpArray[i - 1][j] + coin[i - 1][j - 1]) : (dpArray[i][j - 1] + coin[i - 1][j - 1]);
}
}
int i = rowCount;
int j = colCount;
int pathSize = 0;
while (i > 0 && j > 0) {
path[pathSize]->first = i;
path[pathSize]->second = j;
pathSize++;
if (dpArray[i - 1][j] > dpArray[i][j - 1]) {
i = i - 1;
} else {
j = j - 1;
}
}
path[pathSize]->first = 1;
path[pathSize]->second = 1;
pathSize++;
for (int k = 0; k < pathSize / 2; k++) {
struct Pair temp = *path[k];
*path[k] = *path[pathSize - 1 - k];
*path[pathSize - 1 - k] = temp;
}
for (int i = 0; i <= rowCount; ++i) {
free(dpArray[i]);
}
free(dpArray);
return dpArray[rowCount][colCount];
}
void printPath(const struct Pair** path, int pathSize) {
for (int i = 0; i < pathSize; ++i) {
printf("(%d,%d)\n", path[i]->first, path[i]->second);
}
}
int main() {
int rowCount = 5;
int colCount = 6;
int** coin = (int**)malloc(rowCount * sizeof(int*));
for (int i = 0; i < rowCount; ++i) {
coin[i] = (int*)malloc(colCount * sizeof(int));
}
int coinValues[][6] = {
{0, 0, 0, 0, 1, 0},
{0, 1, 0, 1, 0, 0},
{0, 0, 0, 1, 0, 1},
{0, 0, 1, 0, 0, 1},
{1, 0, 0, 0, 1, 0}
};
for (int i = 0; i < rowCount; ++i) {
for (int j = 0; j < colCount; ++j) {
coin[i][j] = coinValues[i][j];
}
}
struct Pair** path = (struct Pair**)malloc((rowCount + colCount) * sizeof(struct Pair*));
for (int i = 0; i < rowCount + colCount; ++i) {
path[i] = (struct Pair*)malloc(sizeof(struct Pair));
}
printf("收集到的硬币数:%d\n", collectCoin(coin, rowCount, colCount, path));
printPath((const struct Pair**)path, rowCount + colCount);
for (int i = 0; i < rowCount; ++i) {
free(coin[i]);
}
free(coin);
for (int i = 0; i < rowCount + colCount; ++i) {
free(path[i]);
}
free(path);
return 0;
}