usaco 3.3 game1 2008.11.7

usaco 3.3 game1 2008.11.7

问题:我的理解错误,他说是一个序列,放当成了分好多不同的行,是一个矩阵,实际上是一个线形的序列

法一:贪心,过四组

{

ID:

PROG: game1

LANG: PASCAL

}

program p_game1;
const fin='game1.in';fout='game1.out';
var f1,f2:text;
    i,n,x1,x2,x:longint;
begin
  assign(f1,fin);reset(f1);
  assign(f2,fout);rewrite(f2);
  read(f1,n);x1:=0;x2:=0;

  for i:=1 to n do
    begin read(f1,x);
          if i mod 2=1 then inc(x1,x) else inc(x2,x);
    end;
  if x1>x2 then writeln(f2,x1,' ',x2) else writeln(f2,x2,' ',x1);
  close(f1);
  close(f2);
end.

法二:dp,有点像回文词,都是长度在外层循环,序列的头在内层循环.—最小代价子母树

博弈问题,可以使用动态规划求解

状态定义:F[i,j]表示第一个玩家先取时,在第i到第j的子序列中能拿到的最高分;用S[i][j]表示第i到第j的子序列中所有数字的和;用num[i]表示第1到第n的序列中第i个数。

边界条件:F[i][i]=num[i]

状态转移方程:

F[i][j]=max{num[i]+S[i+1][j]-F[i+1][j],num[j]+S[i][j-1]-F[i][j-1]}

结果

p1=F[1][n];

p2=S[1][n]-F[1][n];

解析:

num[i]+S[i+1][j]-F[i+1][j]表示的是,p1拿第i到第j最左边的数,然后轮到p2在第i+1到第j的序列中先取,会剩下S[i+1][j]-F[i+1][j],这些归p1。

{

ID:

PROG: game1

LANG: PASCAL

}

program game1;
var n:longint;
      a,sum:array[-100..101]of longint;
      f:array[0..101,0..101]of longint;
procedure init;
var i:longint;
begin
    fillchar(sum,sizeof(sum),0);
    read(n);
    for i:=1 to n do
      begin read(a[i]);sum[i]:=sum[i-1]+a[i];end;
end;
function maxit(a,b:longint):longint;
begin if a>b then exit(a) else exit(b);end;
procedure main;
var len,st,ed:longint;
begin
   fillchar(f,sizeof(f),0);
   for len:=1 to n do//长度在外层循环,因为要由小的长度推出大的长度
     for st:=1 to n-len+1 do
       begin
          ed:=st+len-1;
          f[st,ed]:=maxit(sum[ed-1]-sum[st-1]-f[st,ed-1]+a[ed],sum[ed]-sum[st]-f[st+1,ed]+a[st]);
       end;
      writeln(f[1,n],' ',sum[n]-f[1,n]);
     end;
     begin
       assign(input,'game1.in');
       reset(input);
       assign(output,'game1.out');
       rewrite(output);
       init;
       main;
       close(input);close(output);
    end.

DATA

USER: Xi Zhang []
TASK: game1
LANG: PASCAL
 
Compiling...
Compile: OK
 
Executing...
   Test 1: TEST OK [0.000 secs, 244 KB]
   Test 2: TEST OK [0.011 secs, 244 KB]
   Test 3: TEST OK [0.000 secs, 244 KB]
   Test 4: TEST OK [0.000 secs, 244 KB]
   Test 5: TEST OK [0.000 secs, 248 KB]
   Test 6: TEST OK [0.000 secs, 248 KB]
   Test 7: TEST OK [0.000 secs, 248 KB]
   Test 8: TEST OK [0.000 secs, 244 KB]
   Test 9: TEST OK [0.000 secs, 248 KB]
   Test 10: TEST OK [0.000 secs, 248 KB]
   Test 11: TEST OK [0.000 secs, 244 KB]
   Test 12: TEST OK [0.000 secs, 244 KB]
   Test 13: TEST OK [0.000 secs, 248 KB]
   Test 14: TEST OK [0.000 secs, 244 KB]
   Test 15: TEST OK [0.000 secs, 244 KB]
   Test 16: TEST OK [0.000 secs, 244 KB]
 
All tests OK.

Your program ('game1') produced all correctanswers!  This is your

submission #2 for this problem.  Congratulations!

Hereare the test data inputs:

------- test 1 -------
6
4 7 2 9 5 2
------- test 2 -------
2
134 187
------- test 3 -------
20
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100
------- test 4 -------
3
73 126 152
------- test 5 -------
30
105 57 64 79 188 102 52 145 188 2 163 147 174 163 198 9 133 159 184 104 70
19 57 174 184 57 154 123 106 129
------- test 6 -------
55
172 15 184 147 51 16 98 162 17 199 43 32 28 134 141 63 124 121 152 8 74 63
121 102 149 134 90 4 3 113 109 194 175 157 87 7 175 71 125 62 81 53 94 68 18
184 65 153 22 20 177 125 82 169 155
------- test 7 -------
80
110 130 89 22 43 15 55 126 176 43 66 36 69 194 1 66 132 175 63 34 96 178 100
198 184 64 178 144 125 111 49 188 118 178 8 7 73 18 173 73 31 197 109 12 118
146 197 49 92 13 90 61 76 31 53 6 121 68 126 52 189 92 107 168 3 1 98 94 154
150 9 74 118 35 157 43 163 68 172 74
------- test 8 -------
99
12 115 150 135 150 121 38 148 148 6 104 56 125 178 176 10 45 37 127 10 113
58 170 149 157 52 18 112 73 177 44 135 143 161 99 165 103 114 110 16 169 194
125 53 103 87 135 26 128 191 113 154 163 46 35 108 195 106 96 178 70 197 93
71 96 145 4 37 152 143 102 163 109 117 70 130 33 63 31 76 190 28 161 61 124
100 19 173 20 79 33 177 32 188 96 139 179 108 110
------- test 9 -------
100
72 150 157 13 64 86 92 11 169 162 107 163 42 61 154 103 166 181 4 11 94 132
14 53 88 190 3 157 102 88 25 189 151 99 147 109 12 200 4 162 94 58 51 81 29
45 81 165 28 200 116 12 134 163 72 159 26 1 64 14 125 131 181 136 19 76 198
43 188 64 24 3 34 187 194 193 190 147 175 85 142 91 7 20 95 183 43 65 147
196 112 86 106 173 71 141 185 58 64 131
------- test 10 -------
2
10
1
------- test 11 -------
6
4
7
2
9
5
2
------- test 12 -------
20
6
6
11
8
16
7
1
20
2
16
9
4
20
6
14
1
14
13
6
19
------- test 13 -------
30
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
34
------- test 14 -------
50
39
33
6
16
15
12
21
27
9
30
12
6
5
33
45
23
30
44
31
43
33
12
34
27
44
5
38
13
33
2
1
22
35
7
37
49
19
7
26
27
36
38
33
41
20
27
13
49
21
44
------- test 15 -------
100
39
197
16
12
149
125
195
189
38
102
128
27
60
132
105
9
54
56
146
193
66
88
85
121
99
19
104
8
177
70
41
17
68
57
29
17
181
24
6
20
126
134
46
185
67
151
194
120
8
140
113
73
28
197
194
126
16
98
134
193
167
174
10
35
31
38
51
13
62
57
32
187
191
78
172
58
30
167
177
37
107
90
110
135
88
104
62
103
3
195
97
169
170
106
5
2
144
56
15
6
------- test 16 -------
100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值