博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Light OJ 1031: Easy Game 区间DP
阅读量:5020 次
发布时间:2019-06-12

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

Easy Game

题目链接:

题意:

给出一个含n个数的序列(n≤100),A和B每次能从这个序列的左端或右端取任意个数,这两个人很聪明,每次都会取对自己最优的情况(自己取得的数的和就是获得的分数,要使分数尽可能比对方的大),现在由A先开始取,求A的分数-B的分数的最大值。

 

题解:

有点博弈的感觉在里边,设dp[i,j]为区间[i,j]的最大值,则可以在[i,j]内取一个值k,使A先取k~j的所有值或者i~k的所有值,则dp[i][j]=max(dp[i][j],sum[j]-sum[k-1]-dp[i][k-1]),sum[j]-sum[k-1]-dp[i][k-1])),假设A先取了k~j的所有值 则此时答案为sum[k~j]-剩余区间中B可以得到的最优情况,同理得A先取i~k时的答案

 

代码

#include<stdio.h>

#include<string.h>
#define Type int
#include<algorithm>
using namespace std;
const int N=101;
Type dp[N][N],sum[N],a[N];
Type mmax(Type x,Type y)
{
  return x>y?x:y;
}
void clean()
{
  for(int i=1;i<=100;++i)
  for(int j=1;j<=100;++j)
  dp[i][j]=(i>j?0:-999999999);
  sum[0]=0;
}
void solve()
{
  int n,T,w=0;
  scanf("%d",&T);
  while(T--)
  {
    scanf("%d",&n);
    clean();
    for(int i=1;i<=n;++i)
    {
      scanf("%d",&a[i]);
      dp[i][i]=a[i];
      sum[i]=sum[i-1]+a[i];
    }
    for(int len=1;len<=n;++len)
    for(int i=1;i+len<=n;++i)
    {
      int j=i+len;
      for(int k=i;k<=j;++k)
      {
        dp[i][j]=mmax(dp[i][j],sum[k]-sum[i-1]-dp[k+1][j]);
        dp[i][j]=mmax(dp[i][j],sum[j]-sum[k-1]-dp[i][k-1]);
      }
    }
    printf("Case %d: %d\n",++w,dp[1][n]);
  }
}
int main()
{
  solve();
  return 0;
}

 

转载于:https://www.cnblogs.com/kiuhghcsc/p/5843599.html

你可能感兴趣的文章
线程池总结
查看>>
Learning to rank (software, datasets)
查看>>
git常见问题
查看>>
.NETFramework:template
查看>>
HM16.0之帧内模式——xCheckRDCostIntra()函数
查看>>
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
Nodejs学习总结 -Express入门(一)
查看>>
web前端优化
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
设计网站大全
查看>>
JVM CUP占用率过高排除方法,windows环境
查看>>
【转】JAVA字符串格式化-String.format()的使用
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
微信架构(转)
查看>>