スプリングプレート(補強)-計ニンニク客
1530 ワード
目次
タイトル
問題解
タイトル 1000ms 32768K
小さなボールが連続したスプリングボードに落ち、小さなボールがスプリングボードの外に落ちるまで、ある場所に弾かれます.
n個の連続したスプリングプレートがあると仮定すると、各スプリングプレートは単位距離を占め、a[i]はi番目のスプリングプレートを代表して小球をa[i]個の距離まで前に弾く.例えば位置1のスプリングは、小球を2距離前進させて位置3に到達させることができる.ボールがスプリングボードに落ちた後、一連のジャンプを経てスプリングボードにポップアップされると、ボールはこのスプリングボードから弾き出すことができます.小さなボールが任意のスプリングボードから落ちて、最大何回弾かれてからスプリングボードがポップアップされるかを計算してほしい.
入力フォーマット
第1行入力nは、n(1≦n≦100000)個のスプリングプレートを表す.2行目にn個の数字を入力し、真ん中をスペースで区切ります.i番目の数字ai(1≦ai≦30)は、i番目のスプリングプレートが小球を移動させることができる距離を表す.
出力フォーマット
スプリングボードをイジェクトするには、ボールが何回まで通過するかを表す整数を出力します.
出力時の各行の末尾の余分なスペースは、答えの正確性に影響しません.
「ファイル入出力」で問題を解く必要があり、入力ファイルはspringである.in、出力ファイルはspring.out
サンプル入力
5
2 2 3 1 2
サンプル出力
3
問題:
知識点:DP
解析:まずdp[i]を用いてi番目の位置から境界を飛び出した回数を記録し,dp状態遷移方程式を導いた:dp[i]=dp[i+a[i]+1,i番目の位置から境界を飛び出した回数=彼がジャンプできる位置から境界を飛び出した回数+1,ここでは逆シーケンス処理に注意する.
コード:
タイトル
問題解
タイトル
小さなボールが連続したスプリングボードに落ち、小さなボールがスプリングボードの外に落ちるまで、ある場所に弾かれます.
n個の連続したスプリングプレートがあると仮定すると、各スプリングプレートは単位距離を占め、a[i]はi番目のスプリングプレートを代表して小球をa[i]個の距離まで前に弾く.例えば位置1のスプリングは、小球を2距離前進させて位置3に到達させることができる.ボールがスプリングボードに落ちた後、一連のジャンプを経てスプリングボードにポップアップされると、ボールはこのスプリングボードから弾き出すことができます.小さなボールが任意のスプリングボードから落ちて、最大何回弾かれてからスプリングボードがポップアップされるかを計算してほしい.
入力フォーマット
第1行入力nは、n(1≦n≦100000)個のスプリングプレートを表す.2行目にn個の数字を入力し、真ん中をスペースで区切ります.i番目の数字ai(1≦ai≦30)は、i番目のスプリングプレートが小球を移動させることができる距離を表す.
出力フォーマット
スプリングボードをイジェクトするには、ボールが何回まで通過するかを表す整数を出力します.
出力時の各行の末尾の余分なスペースは、答えの正確性に影響しません.
「ファイル入出力」で問題を解く必要があり、入力ファイルはspringである.in、出力ファイルはspring.out
サンプル入力
5
2 2 3 1 2
サンプル出力
3
問題:
知識点:DP
解析:まずdp[i]を用いてi番目の位置から境界を飛び出した回数を記録し,dp状態遷移方程式を導いた:dp[i]=dp[i+a[i]+1,i番目の位置から境界を飛び出した回数=彼がジャンプできる位置から境界を飛び出した回数+1,ここでは逆シーケンス処理に注意する.
コード:
#include
#include
#include
#include
using namespace std;
const int NOIP=1e5+35;
int a[NOIP];
int dp[NOIP];//
int main(){
freopen("spring.in","r",stdin);
freopen("spring.out","w",stdout);
int n,ans=-0x3f3f3f3f;//ans
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i];
}
for (int i=n;i>=0;i--){// , why( , )
dp[i]=dp[i+a[i]]+1;
ans=max(dp[i],ans);
}
cout<