之前的 checker 的 dp 部分有一处写错了,过来更改了一下。
#include "testlib.h"
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <vector>
using namespace std;
int dp[110][110];
int cst[110][110];
int N;
int rans,lans;
int main(int argc, char ** argv){
registerTestlibCmd(argc, argv);
N = ouf.readInt(1, 100);
for(int i=1; i<=N; i++)
for(int j=i+1; j<=N; j++)
cst[i][j] = ouf.readInt(1, 100);
//Right Answer
memset(dp, 0x3f, sizeof(dp)); dp[1][1] = 0;
for(int i=2; i<=N; i++)
for(int j=1; j<i; j++){
//dp[i-1][j] -> dp[i][j]
dp[i][j] = min(dp[i][j], dp[i-1][j] + cst[i-1][i]);
//dp[i-1][j] -> dp[i][i-1]
dp[i][i-1] = min(dp[i][i-1], dp[i-1][j] + cst[j][i]);
}
rans = dp[0][0];
for(int i=1; i<=N; i++)
rans = min(rans, dp[N][i]);
//Fake answer
int x = 1, y = 1, sx = 0, sy = 0;
for(int i=2; i<=N; i++){
if(sx + cst[x][i] < sy + cst[y][i]){
sx += cst[x][i];
x = i;
} else{
sy += cst[y][i];
y = i;
}
}
lans = sx + sy;
int sco = min(100, (int)ceil(1.0 * lans / rans / 4) * 4);
if(sco == 100)
quitf(_ok, "Answer Correct! rans = %d, lans = %d", rans, lans);
else
quitp(1.0 * sco / 100, "Answer Partially Correct! rans = %d, lans = %d", rans, lans);
return 0;
}
其中
dp[i][i-1] = min(dp[i][i-1], dp[i-1][j] + cst[j][i]);
之前被写成了:
dp[i][i-1] = min(dp[i][j], dp[i-1][j] + cst[j][i]);