洛谷 P1541 乌龟棋 —— DP

本文详细解析了洛谷P1541题目的动态规划解法,通过C++代码实现,展示了如何利用四维数组进行状态转移,最终求解出最优解。

题目:https://www.luogu.org/problemnew/show/P1541

DP。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=355,xm=45;
int n,m,a[xn],s[5],f[xm][xm][xm][xm];
int rd()
{
  int ret=0,f=1; char ch=getchar();
  while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}
  while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();
  return f?ret:-ret;
}
int main()
{
  n=rd(); m=rd();
  for(int i=1;i<=n;i++)a[i]=rd();
  for(int i=1,x;i<=m;i++)x=rd(),s[x]++;
  f[0][0][0][0]=a[1];
  for(int i=1;i<=m;i++)
    for(int j=0;j<=min(s[1],i);j++)
      for(int k=0;k<=min(s[2],i-j);k++)
        for(int l=0;l<=min(s[3],i-j-k);l++)
          {
              int t=i-j-k-l;
            f[j][k][l][t]=a[1+j+2*k+3*l+4*(i-j-k-l)];
            int ret=0;
            if(j)ret=max(ret,f[j-1][k][l][t]);
            if(k)ret=max(ret,f[j][k-1][l][t]);
            if(l)ret=max(ret,f[j][k][l-1][t]);
            if(i-j-k-l)ret=max(ret,f[j][k][l][t-1]);
            f[j][k][l][t]+=ret;
          }
  printf("%d\n",f[s[1]][s[2]][s[3]][s[4]]);
  return 0;
}

 

转载于:https://www.cnblogs.com/Zinn/p/9757362.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值