Hướng dẫn giải của A Coin Game


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const fi='';
      fo='';
      maxn=2001;
var n,re:longint;
    f:array[0..maxn,1..maxn] of longint;
    a,s:array[0..maxn] of longint;

procedure rf;
var i,x:longint;
begin
     assign(input,fi); reset(input);
     read(n);
     for i:=1 to n do read(a[i]);
     s[0]:=0;
     for i:=n downto 1 do s[n-i+1]:=s[n-i]+a[i];
     close(input);
end;

function min(x,y:longint):longint;
begin
     if x<y then min:=x else min:=y;
end;

function max(x,y:longint):longint;
begin
     if x>y then max:=x else max:=y;
end;

procedure pr;
var i,j,k:longint;
begin
     for i:=1 to n do
         for j:=1 to n do
         begin
              f[i,j]:=f[i,j-1];
              if j*2-1<=i then f[i,j]:=max(f[i,j],s[i]-f[i-2*j+1,2*j-1]);
              if j*2<=i then f[i,j]:=max(f[i,j],s[i]-f[i-2*j,2*j]);
         end;
end;

procedure wf;
begin
     assign(output,fo); rewrite(output);
     writeln(f[n,1]);
     close(output);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của ladpro98

#include <bits/stdc++.h>
const int N = 2020;
using namespace std;
int a[N], F[N][N], maxF[N][N];
int n;

int main() {
    ios :: sync_with_stdio(0); cin.tie();
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    reverse(a + 1, a + 1 + n);
    for(int i = 1; i <= n; i++) a[i] += a[i - 1];
    for(int i = 1; i <= n; i++) for(int j = 1; j <= i; j++) {
        F[i][j] = a[i] - maxF[i - j][min(j + j, i - j)];
        maxF[i][j] = max(maxF[i][j - 1], F[i][j]);
    }
    cout << max(F[n][1], F[n][2]);
    return 0;
}

Code mẫu của RR

{$MODE OBJFPC}

uses math;
const
  MAXN          =       4011;

var
  n             :       longint;
  f             :       array[1..MAXN,1..MAXN] of longint;
  s,c           :       array[1..MAXN] of longint;

procedure inp;
    var
      i:longint;
    begin
      read(n);
      for i:=1 to n do read(c[i]);
      for i:=n downto 1 do s[i]:=s[i+1]+c[i];
    end;

procedure solve;
    var
      i,k:longint;
    begin
      for i:=n downto 1 do
      for k:=1 to n do
        if k=1 then f[i,k]:=s[i]-f[i+1,2]
        else f[i,k]:=max(f[i,k-1],s[i]-f[i+k,min(k*2,n)]);

      writeln(max(f[1,1],f[1,2]));
    end;

begin
  inp;
  solve;
end.

Code mẫu của hieult

#include <iostream>
#include <cstdio>
//#include <conio.h>

int tong[2010],boc[2010][2010],n,a[2010];

int max(int a,int b) {return a>b?a:b ;}
int main()
{
    scanf("%d",&n);
    for(int i = 1;i<=n;i++) scanf("%d",&a[n+1-i]);
    for(int i = 1;i<=n;i++)  tong[i] = tong[i-1]+a[i];
    for(int i = 1;i<=n;i++)
        for(int j = 1;j<=n;j++)
        {
             boc[i][j] = max(boc[i][j],boc[i][j-1]);
             if(i>=2*j-1) boc[i][j] = max(boc[i][j],tong[i]-boc[i-2*j+1][2*j-1]);
             if(i>=2*j) boc[i][j] = max(boc[i][j],tong[i]-boc[i-2*j][2*j]);
        }
    printf("%d",boc[n][1]);
    //getch();
}

Code mẫu của ll931110

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
typedef long long ll;
using namespace std;

int a[2010],sum[2010],dp[2010][2010];
int n;

int main()
{
//    freopen("xoinc.in","r",stdin);
//    freopen("xoinc.ou","w",stdout);
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[n + 1 - i]);
    memset(sum,0,sizeof(sum));
    for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];

    memset(dp,0,sizeof(dp));
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
      {
          dp[i][j] = dp[i][j - 1];
          if (i >= 2 * j - 1) dp[i][j] = max(dp[i][j],sum[i] - dp[i - (2 * j - 1)][2 * j - 1]);
          if (i >= 2 * j) dp[i][j] = max(dp[i][j],sum[i] - dp[i - 2 * j][2 * j]);
      };
    printf("%d\n", dp[n][1]);
};

Code mẫu của khuc_tuan

#include <iostream>
#include <cstdio>
using namespace std;

int n, a[2020], S;
int F[2020][2020], M[2020][2020];

int main() {
    scanf("%d", &n);
    for(int i=0;i<n;++i) {
        scanf("%d", a+i);
        S += a[i];
    }
    for(int i=n-1;i>=0;--i) {
        int total = 0;
        for(int j=1;i+j<=n;++j) {
            total += a[i+j-1];
            int z = 2 * j;
            if(z + i + j > n) z = n - i - j;
            F[i][j] = total - M[i+j][z];
        }
        M[i][1] = F[i][1];
        for(int j=2;j+i<=n;++j)
            M[i][j] = max( M[i][j-1], F[i][j]);
    }
    int best = max( M[0][1], M[0][2]);
    cout << (S + best) / 2 << endl;
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.