直接上代码吧,脑阔痛
#include <bits/stdc++.h>
using namespace std;
const int maxn = 60, m = 0x3f3f3f3f;
int n, c;
int p[maxn], w[maxn];
int d, j;
int f[maxn][maxn][2], t[maxn][maxn][2];
char ch;
int read()
{
d = 0, ch = getchar();
while(ch < '0' || ch > '9')
ch = getchar();
while(ch >= '0' && ch <= '9')
{
d = (d << 1) + (d << 3) + ch - '0';
ch = getchar();
}
return d;
}
int main()
{
n = read(), c = read();
for(int i = 1 ; i <= n ; i ++)
{
p[i] = read();
w[i] = read();
}
memset(f, 0x3f, sizeof(f));
f[c][c][0] = f[c][c][1] = 0;
for(int k = 1 ; k < n ; k ++)
{
for(int i = 1 ; i + k <= n ; i ++, j = i + k)
{
if(f[i + 1][j][0] < m || f[i + 1][j][1] < m)//是否合法, 防止t无效累加
{
if(f[i + 1][j][0] + (t[i + 1][j][0] + p[i + 1] - p[i]) * w[i] <= f[i + 1][j][1] + (t[i + 1][j][1] + p[j] - p[i]) * w[i])//这里要取等,时间要贪心
{
t[i][j][0] = t[i + 1][j][0] + p[i + 1] - p[i];
f[i][j][0] = f[i + 1][j][0] + t[i][j][0] * w[i];
}
else
{
t[i][j][0] = t[i + 1][j][1] + p[j] - p[i];
f[i][j][0] = f[i + 1][j][1] + t[i][j][0] * w[i];
}
}
if(f[i][j - 1][0] < m || f[i][j - 1][1] < m)
{
if(f[i][j - 1][0] + (t[i][j - 1][0] + p[j] - p[i]) * w[j] < f[i][j - 1][1] + (t[i][j - 1][1] + p[j] - p[j - 1]) * w[j])
{
t[i][j][1] = t[i][j - 1][0] + p[j] - p[i];
f[i][j][1] = f[i][j - 1][0] + t[i][j][1] * w[j];
}
else
{
t[i][j][1] = t[i][j - 1][1] + p[j] - p[j - 1];
f[i][j][1] = f[i][j - 1][1] + t[i][j][1] * w[j];
}
}
}
}
printf("%d", min(f[1][n][1], f[1][n][0]));
return 0;
}
会不会是我没有注意后效性?