羅谷 P1802-5回体験日
トピックの背景
Le Douが活動中です!人に当たるたびに経験値5倍ゲット!しかし、absi2011 は、自分よりもレベルの高い友達をどうすることもできずに眺め、自分が彼らを殺せるかどうか疑問に思いました。多くの経験を積める人を排除してください。
トピックの説明
今、absi2011 は麻薬のミニパック x 個を取り出し (麻薬で人を殴るのは恥ずかしいことです...)、それらの人々との戦いを開始する準備ができています。
ミニパックは一度しか使用できないため、absi2011 はこれらの薬を慎重に使用する必要があります。人を倒すために使用する最低限の属性薬に達していない場合、人に当たると負けてしまうという悲劇があります>。<そこで彼は使用します。他の人を倒すには薬が2つ、他の人は戦うには薬が3つ必要だと言いました、つまりあなたが負けることになり、この2つの属性薬は無駄になります。
今では、負けたり勝ったりの経験を持ち、勝つためにはいくつかの薬を服用する必要がある友達がn人います。最大経験値を見つけます(最後に5倍する必要があることに注意してください)
入力フォーマット
最初の行の 2 つの数値、n と x
次の n 行にはそれぞれ 3 つの数字があり、それぞれ負けることによって得られる経験 (lose[i])、勝つことによって得られる経験 (win[i])、および少なくともプレイ後に使用される薬の数を表します。 ( use[i] )。
出力フォーマット
整数、得られる経験値の最大値
入力サンプルと出力サンプル
入力#1
6 8
21 52 1
21 70 5
21 48 2
14 38 3
14 36 1
14 36 2
出力 #1
1060
指示/ヒント
【ヒント】
5 回の経験値アクティビティ中、absi2011 は常にこの属性ポーションの代わりにスタミナ ポーションを摂取します >.<
【データ範囲】
データの 10% については、x=0 が保証されます
データの 30% については、n<=10、x<=20 であることを確認してください。
データの 60% については、n<=100、x<=100、10<=lose[i]、win[i]<=100、use[i]<=5 であることを確認します。
100% データの場合、n<=1000、x<=1000、0<lose[i]<=win[i]<=1000000、0<=use[i]<=1000 を保証します。
一連の考え
状態区分 f(i, j):
set: 1 ~ i から選択することで得られる経験セットを意味し、使用する薬瓶の数が j を超えないことを意味します: 1 ~ i から選択することを意味し、薬の数使用されるボトルは利用可能な経験値を超えませんコレクション:1 ~iから選択して獲得できる経験値を示し、使用する薬瓶の数はjを超えません。
属性: 最大 (最大) 属性: 最大 (最大)属性:最大(最大) _ _
コア:
i 番目の友人には、電話をかけるかどうかの 2 つの選択肢があります。i 番目の友人には、電話をかけるかどうかの 2 つの選択肢がありますi番目の友人には、電話をかけるかどうかの2 つの選択肢があります。状態遷移
:電話をかけることを選択します: f ( i , j ) = f ( i − 1 , j − uer [ i ] ) + win [ i ]
再生: f(i,j) = f(i-1,j-uer[i])+win[i]ヒットすることを選択します: f ( i ,j )=f (私−1 、j−uとr [ i ] )+ウィ[イ] _ _
戦わないことを選択: f ( i , j ) = f ( i − 1 , j ) + los [ i ] 戦わないことを選択: f(i,j) = f(i-1,j)+los[i]f ( i , _ _ _ _j )=f (私−1 、j )+l o s [ i ]
コアコード
for(int i=1;i<=n;i++) {
for(int j=0;j<=x;j++) {
f[i][j] = f[i-1][j] + l[i];
if(j>=u[i]) {
f[i][j] = Math.max(f[i-1][j]+l[i],f[i-1][j-u[i]]+w[i]);
}
}
}
完全なコード
package p1802;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
static int N = 1010;
static long f[][] = new long[N][N];
static int w[] = new int[N],l[] = new int[N],u[] = new int[N];
public static void main(String[] args) throws Exception{
Read r = new Read();
int n = r.nextInt(),x = r.nextInt();
for(int i=1;i<=n;i++) {
l[i] = r.nextInt();w[i] = r.nextInt();u[i] = r.nextInt();
}
for(int i=1;i<=n;i++) {
for(int j=0;j<=x;j++) {
f[i][j] = f[i-1][j] + l[i];
if(j>=u[i]) {
f[i][j] = Math.max(f[i-1][j]+l[i],f[i-1][j-u[i]]+w[i]);
}
}
}
System.out.println(f[n][x]*5);
}
}
class Read{
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public int nextInt() throws Exception{
st.nextToken();
return (int)st.nval;
}
}