动态规划
其中arr[now][i][j]代表了从右往左第now个数为i第now-1个数为j时,能达到的最大值。
动态方程:arr[now][i][j]=max(arr[now][i][j],arr[now+1][j][k])
我是看他才看懂的:
http://www.cppblog.com/Ayue/archive/2011/11/10/159937.html
#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
#include<cstring>
using namespace std;
int arr[10001][10][10];
int w[10][10][10];
int who[10001][10][10];
int main() {
int m, n, val;
string str;
while (scanf("%d%d", &m, &n) != EOF) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
arr[n][i][j] = 0;
arr[n - 1][i][j] = 0;
}
}
for (int i = 0; i <= n - 2; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
arr[i][j][k] = -1000000000;
}
}
}
memset(w, 0, sizeof(w));
map<string, int> mp;
for (int i = 0; i < m; i++) {
cin >> str >> val;
w[str[0] - '0'][str[1] - '0'][str[2] - '0'] = val;
}
if (n == 2) {
cout << "00" << endl;
continue;
} else if (n == 1) {
cout << "0" << endl;
continue;
}
//DP
int i, j, k, now;
for (now = n - 2; now >= 1; now--) {
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
if (arr[now + 1][j][k] + w[i][j][k] > arr[now][i][j]) {
arr[now][i][j] = arr[now + 1][j][k] + w[i][j][k];
who[now][i][j] = k;
}
}
}
}
}
//找出最大值,并标记索引
int maxval = -1000000000;
int k1, k2;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (arr[1][i][j] > maxval) {
maxval = arr[1][i][j];
k1 = i;
k2 = j;
}
}
}
//递归查找索引
string ans = "";
ans += char(k1 + '0');
ans += char(k2 + '0');
for (i = 1; i <= n - 2; i++) {
k = who[i][k1][k2];
ans += char(k + '0');
k1 = k2;
k2 = k;
}
cout << ans << endl;
}
}