白準11052カードを購入


質問する



質問リンク:https://www.acmicpc.net/problem/11052

ポリシー

  • はできるだけお金をたくさん使います.
  • の小さな値から、問題を解決するためにすべての状況の数を順次チェックします.しかし、このときメモをとって、時間の複雑さを下げます.
  • コード#コード#

    #include<bits/stdc++.h>
    
    using namespace std;
    
    #define mine
    
    vector<int> p(1001);
    int dp[1001];
    int main(){
        int n;
        cin >> n;
    
        for(int i=1; i<=n; i++){
            cin >> p[i];
        }
      
    
        for(int i=1; i<=n; i++){
        	// dp[1] 부터 순서대로 값을 계산하게 된다. 
            // dp[i-j] + p[j] 의 최대값이 곧 dp[i]의 값이 된다.
            for(int j=1; j<=i; j++){
                dp[i] = max(dp[i], dp[i-j]+p[j]);
            }
        }
        cout << dp[n];
        return 0;
    }

    感想


    私は解決しなかったので、他の人のブログを参考にしました.しかし、コアは一つしかありません.この問題にはN枚のカードが与えられており、これらのカードが与えられた場合、これらのカードで計算するだけでよい.この技術を身につけた.
    dp[i]=max(dp[i],dp[i-j]+p[j])という方法を忘れないでください.