您的位置:首页 > 其它

UVa1628 UVaLive5847 Pizza Delivery

2016-01-05 11:36 176 查看
填坑系列(p.302)

既然不知道后面还要卖多少个就加一维状态嘛。。

lrj写的O(n)转移?其实转移可以O(1)

貌似按x排序有奇效?

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>

using namespace std;

void setIO(const string& s) {
freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
template<typename Q> Q read(Q& x) {
static char c, f;
for(f = 0; c = getchar(), !isdigit(c); ) if(c == '-') f = 1;
for(x = 0; isdigit(c); c = getchar()) x = x * 10 + c - '0';
if(f) x = -x;
return x;
}
template<typename Q> Q read() {
static Q x; read(x); return x;
}

const int N = 100 + 10, INF = 0x3f3f3f3f;

int p
, v
, n, cas;
int f

[2];
int vis

[2];

int dfs(int s, int e, int cnt, int pos) {
if(!cnt) return 0;
int &ans = f[s][e][cnt][pos];
if(vis[s][e][cnt][pos] == cas) return ans;
vis[s][e][cnt][pos] = cas;

ans = -INF;
int a[] = {s, e};

/*for(int i = 0; i < s; i++) {
ans = max(ans, v[i] - cnt * abs(p[i] - p[a[pos]]) + dfs(i, e, cnt - 1, 0));
}
for(int i = e + 1; i < n; i++) {
ans = max(ans, v[i] - cnt * abs(p[i] - p[a[pos]]) + dfs(s, i, cnt - 1, 1));
}*/

if(s - 1 >= 0) {
int dlt = cnt * abs(p[s - 1] - p[a[pos]]);
ans = max(ans, v[s - 1] - dlt + dfs(s - 1, e, cnt - 1, 0));
ans = max(ans, -dlt + dfs(s - 1, e, cnt, 0));
}
if(e + 1 < n) {
int dlt = cnt * abs(p[e + 1] - p[a[pos]]);
ans = max(ans, v[e + 1] - dlt + dfs(s, e + 1, cnt - 1, 1));
ans = max(ans, -dlt + dfs(s, e + 1, cnt, 1)) ;
}

return ans;
}

int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif

int T; scanf("%d", &T);
for(cas = 1; cas <= T; cas++) {
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", p + i);
for(int i = 0; i < n; i++) scanf("%d", v + i);

int ans = 0;
for(int k = 1; k <= n; k++) {
for(int i = 0; i < n; i++) {
ans = max(ans, v[i] - k * abs(p[i]) + dfs(i, i, k - 1, 0));
}
}
printf("%d\n", ans);
}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: