博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P1541 (dp)
阅读量:4926 次
发布时间:2019-06-11

本文共 1541 字,大约阅读时间需要 5 分钟。

题意:

有一条由\(n\)块瓷砖组成的路,每个瓷砖都有一个权值\(a_i\)。现在有个乌龟,有\(m\)\(4\)种的卡片,分别是\(1,2,3,4\)。每张卡牌上的数字代表他能够向前走多少步。现在问题,这个乌龟用这\(m\)种卡片走到终点最多可以获取多少积分。

分析:

因为最终的结果跟每次选取卡牌的状态有关,故不妨设一个最暴力的\(dp\)式子:\(dp[a][b][c][d][pos]\)代表现在有\(a\)\(1\)卡牌,\(b\)\(2\)卡牌,\(c\)\(3\)卡牌,\(d\)\(4\)卡牌,且当前的位置为\(pos\)。显然当前的位置可以从四个部分转移而来,因此有转移方程\[dp[a][b][c][d][pos]=max(dp[a-1][b][c][d][pos_1],dp[a][b-1][c][d][pos_2],dp[a][b][c-1][d][pos_3],dp[a][b][c][d-1][pos_4])+a[pos]\]。而显然当前的\(pos\)可以通过\(a,b,c,d\)计算得出,因此我们只需要开一个四维的状态记录即可。时间复杂度\(\mathcal{O}(n^4)\)

代码:

#include 
#define maxn 355using namespace std;int dp[50][50][50][50];int a[maxn],mp[5];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } while(m--){ int num; scanf("%d",&num); mp[num]++; } dp[0][0][0][0]=a[1]; for(int i=0;i<=mp[1];i++){ for(int j=0;j<=mp[2];j++){ for(int k=0;k<=mp[3];k++){ for(int kk=0;kk<=mp[4];kk++){ int cur=(i+j*2+k*3+kk*4+1); if(i!=0) dp[i][j][k][kk]=max(dp[i][j][k][kk],dp[i-1][j][k][kk]+a[cur]); if(j!=0) dp[i][j][k][kk]=max(dp[i][j][k][kk],dp[i][j-1][k][kk]+a[cur]); if(k!=0) dp[i][j][k][kk]=max(dp[i][j][k][kk],dp[i][j][k-1][kk]+a[cur]); if(kk!=0) dp[i][j][k][kk]=max(dp[i][j][k][kk],dp[i][j][k][kk-1]+a[cur]); } } } } printf("%d\n",dp[mp[1]][mp[2]][mp[3]][mp[4]]); return 0;}

转载于:https://www.cnblogs.com/Chen-Jr/p/11177415.html

你可能感兴趣的文章
Codeforces-1059D:Nature Reserve问最大的圆包含全部点
查看>>
牛客练习赛24
查看>>
转发推荐系统文章
查看>>
并排,快排和冒泡排序
查看>>
BZOJ 1073: [SCOI2007]kshort
查看>>
在centos上安装tomcat
查看>>
第十四章 异常处理
查看>>
超链接-a标签
查看>>
转载ASP.NET MVC中Session的处理机制
查看>>
Makefile 語法簡介
查看>>
sql面试题(学生表_课程表_成绩表_教师表)
查看>>
Sublime 保存时自动转换tab成空格
查看>>
atom 插件 python语法验证linter-flake8-------填坑
查看>>
cuda中当元素个数超过线程个数时的处理案例
查看>>
转:PCL+VS2010环境配置
查看>>
volatile
查看>>
uploadify3.2.1加载时,报NetworkError 404 Not Found或NetworkError forbidden错误
查看>>
Vim 常用命令总结
查看>>
python中的数据类型(二)
查看>>
Android:scrollview与listview共存
查看>>