清北暑假模拟day1 生活
2016-10-19 19:48
225 查看
/* 数字三角形,要求第K大的值,可以推知,如果得知k的范围,那么一定是在上一行可转移状态的对应范围内(反证法可以证明),这个在背包九讲里也有提及 */ #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int n,k,f[110][110][15],z[110][110],y[1010]; int main() { freopen("live.in","r",stdin); freopen("live.out","w",stdout); scanf("%d%d",&n,&k); for (int a=1;a<=n;a++) for (int b=1;b<=a;b++) scanf("%d",&z[a][b]); for (int a=1;a<=n;a++) for (int b=1;b<=a;b++) for (int c=1;c<=k;c++) f[a][b][c]=-12345; f[1][1][1]=z[1][1]; for (int a=1;a<n;a++) for (int b=1;b<=a;b++) for (int c=1;c<=k;c++) if (f[a][b][c]!=-12345) { int v=f[a][b][c]+z[a+1][b]; for (int d=1;d<=k;d++) if (v>=f[a+1][b][d]) { for (int e=k;e>d;e--) f[a+1][b][e]=f[a+1][b][e-1]; f[a+1][b][d]=v; break; } v=f[a][b][c]+z[a+1][b+1]; for (int d=1;d<=k;d++) if (v>=f[a+1][b+1][d]) { for (int e=k;e>d;e--) f[a+1][b+1][e]=f[a+1][b+1][e-1]; f[a+1][b+1][d]=v; break; } } int cnt=0; for (int a=1;a<=n;a++) for (int b=1;b<=k;b++) y[++cnt]=f [a][b]; sort(y+1,y+cnt+1); printf("%d\n",y[cnt-k+1]); return 0; }
相关文章推荐
- 清北暑假模拟day1 爱
- 清北暑假模拟day1 艳阳天
- 清北暑假模拟day2 将
- 清北暑假模拟day2 之
- 【2018暑假集训模拟一】Day1题解
- 考前模拟,qbxt十月底day1下午
- 黄学长模拟day1 某种密码
- 1/21集训二 模拟+贪心 G.(贪心 安排做作业的时间)Doing Homework again(感觉有点像HDU安排电视节目的那题(今年暑假不AC))
- 记2017暑假这一段生活
- NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day1
- 【模拟】【NOIP2011提高组Day1】铺地毯
- 黄学长模拟day1 球的序列
- 【NOIP模拟考三】DP+组合数 day1 third 小球游戏
- 【JZOJ5060】【GDOI2017第二轮模拟day1】公路建设
- 【JZOJ5073】【GDOI2017第三轮模拟day1】影魔
- 【省选专题一】图论 jzoj 5060.【GDOI2017第二轮模拟day1】公路建设 线段树+最小生成树+并查集
- 暑假的游戏&生活
- 【NOIP模拟考一】组合数学 day1 third 子集
- 【2018暑假集训模拟一】Day2题解
- 省常中模拟 Test3 Day1