質問編集履歴

1

ご回答を元にした試行の追記

2020/06/02 06:00

投稿

shake9
shake9

スコア19

test CHANGED
File without changes
test CHANGED
@@ -79,3 +79,85 @@
79
79
  dp[i+1][ss] = (dp[i][ss]*2%MOD + dp[i][ss-a[i]])%MOD
80
80
 
81
81
  としましたが、逆にTLEとなるケースが2つ増えてしまいました。
82
+
83
+
84
+
85
+ ##以降はyudedaka67様のご回答を参考にさせていただき試した修正
86
+
87
+ ### 二重配列の廃止
88
+
89
+ ```Python
90
+
91
+ ...
92
+
93
+ dp = [[0]*(s+1) for i in range(n+1)] #動的計画法を用いる 参照渡しによるバグを防ぐためリスト内包表記
94
+
95
+
96
+
97
+ dp = [0]*(s+1)
98
+
99
+
100
+
101
+ ループ部分を以下に変更
102
+
103
+ for i in range(n):
104
+
105
+ for ss in range(s,-1,-1):
106
+
107
+ if(ss >= a[i]):
108
+
109
+ dp[ss] = (dp[ss]*2 + dp[ss-a[i]])%MOD #非常に大きな数になると考えられるため先にMOD計算を行う
110
+
111
+ else:
112
+
113
+ dp[ss] = dp[ss]*2 % MOD
114
+
115
+ ```
116
+
117
+ →TLEとなるファイルが7から5に
118
+
119
+
120
+
121
+ ###Numpyの導入
122
+
123
+ ######numpy.zerosによるベクトル生成
124
+
125
+ これだけだと逆にimportする分TLEが増えてしまいました
126
+
127
+ ######numpyのベクトルの整数倍を用いる
128
+
129
+ ```Python
130
+
131
+ ...for iの中身を修正
132
+
133
+ ddp = dp * 2
134
+
135
+ for ss in range(s,-1,-1):
136
+
137
+ if(ss >= a[i]):
138
+
139
+ ddp[ss] += dp[ss-a[i]]%MOD #非常に大きな数になると考えられるため先にMOD計算を行う
140
+
141
+ dp = ddp % MOD
142
+
143
+ ```
144
+
145
+ これでもTLEとなるようでした
146
+
147
+
148
+
149
+ ######numpyのベクトルの加算を用いる
150
+
151
+ ```Python
152
+
153
+ ...for iの中身を修正
154
+
155
+ ddp = dp * 2 % MOD
156
+
157
+ ddp[a[i]:] += dp[:-a[i]] #非常に大きな数になると考えられるため先にMOD計算を行う
158
+
159
+ dp = ddp % MOD
160
+
161
+ ```
162
+
163
+ こうすることで1/S倍ほどになり、ACできました。