专栏文章
P1541 [NOIP 2010 提高组] 乌龟棋
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minps4lo
- 此快照首次捕获于
- 2025/12/02 06:21 3 个月前
- 此快照最后确认于
- 2025/12/02 06:21 3 个月前
状态:
状态表示为当使用a张走1步的,b张2步的,c张3步的,d张4步的
对于这个状态的转移方程为:
而为什么要呢?
因为初始点为而 计算出的是往后移动的距离,所以还要
而且初始点为所以初始化为
CPP#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn(1e5+10);
int n,m;
int e[maxn],g[5];
int dp[41][41][41][41];
int main(){
cin>>n>>m;
for(int i(1);i<=n;i++){
cin>>e[i];
}
for(int i(1);i<=m;i++){
int x;
cin>>x;
g[x]++;
}
dp[0][0][0][0]=e[1];
for(int a(0);a<=g[1];a++){
for(int b(0);b<=g[2];b++){
for(int c(0);c<=g[3];c++){
for(int d(0);d<=g[4];d++){
int sum(1+a+b*2+c*3+d*4);
if(a!=0){
dp[a][b][c][d]=max(dp[a][b][c][d],dp[a-1][b][c][d]+e[sum]);
}
if(b!=0){
dp[a][b][c][d]=max(dp[a][b][c][d],dp[a][b-1][c][d]+e[sum]);
}
if(c!=0){
dp[a][b][c][d]=max(dp[a][b][c][d],dp[a][b][c-1][d]+e[sum]);
}
if(d!=0){
dp[a][b][c][d]=max(dp[a][b][c][d],dp[a][b][c][d-1]+e[sum]);
}
}
}
}
}
cout<<dp[g[1]][g[2]][g[3]][g[4]]<<'\n';
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...