uva1628 Pizza Delivery
2024-08-30 15:19:44
fixing great wall 的变形
dp(i,j,k,p)不考虑i-j的客人,还要送k个人,目前位置在p
起点i和总数量k都要枚举
dp(i,j,k,p)=max(dp(m,j,k-1,p)+valm,dp(i,d,k-1,p)+vald)
画一下图,就发现每个点罚时是当前k*abs【pi】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = + ; int kase, n;
int p[maxn], v[maxn];
int d[maxn][maxn][maxn][];
int vis[maxn][maxn][maxn][]; // already considered s~e, still need to delivery to cnt people.
// pos = 0 means at s, pos = 1 means at e
int dp(int s, int e, int cnt, int pos) {
if(cnt == ) return ; int &ans = d[s][e][cnt][pos];
if(vis[s][e][cnt][pos] == kase) return ans;
vis[s][e][cnt][pos] = kase; ans = ;
if(!pos) {
for(int i = ; i < s; i++)
ans = max(ans, v[i] - cnt * abs(p[i] - p[s]) + dp(i, e, cnt - , ));
for(int i = e + ; i < n; i++)
ans = max(ans, v[i] - cnt * abs(p[i] - p[s]) + dp(s, i, cnt - , ));
}
else {
for(int i = ; i < s; i++)
ans = max(ans, v[i] - cnt * abs(p[i] - p[e]) + dp(i, e, cnt - , ));
for(int i = e + ; i < n; i++)
ans = max(ans, v[i] - cnt * abs(p[i] - p[e]) + dp(s, i, cnt - , ));
}
return ans;
} int main() {
int T;
scanf("%d",&T);
memset(vis, , sizeof(vis));
for(kase = ; kase <= T; kase++) {
scanf("%d", &n);
for(int i = ; i < n; i++) scanf("%d", &p[i]);
for(int i = ; i < n; i++) scanf("%d", &v[i]); int ans = ;
for(int k = ; k <= n; k++)
for(int i = ; i < n; i++)
ans = max(ans, v[i] - k * abs(p[i]) + dp(i, i, k - , ));//注意罚时的计算
printf("%d\n",ans);
}
return ;
}
最新文章
- JavaScript的基本语法
- JVM_七种垃圾收集器介绍
- 域名解析与多域名绑定多个Tomcat项目
- 第三周作业(三):wc程序
- HTML实体字符转化为HTML标签
- java初学。加载图片
- My97DatePicker控制开始时间和结束时间区间
- Gitlab仓库规范实践建议
- [转] Web前端优化之 图片篇
- css3实现无缝滚动效果
- 使用Aspose.Word的基础知识整理
- Python自动化运维之23、Dom
- 转:Lua简明教程
- 【源码】实现Android闹钟功能使用HTML+JS,并附带Alarm代码分享
- 【转】awk内置变量
- CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]
- cvte春招测试面试记录
- day09 函数学习
- Luogu P2336 [SCOI2012]喵星球上的点名
- vim正则表达式