[白俊]1563号皆勤賞



  • 問題で与えられるのはNだけである.

  • に出席
  • 出席:O
  • 欠席:A
  • 遅刻:L

  • 問題条件
  • 皆勤賞を除く
  • 地殻2回以上}
  • 欠席3回
  • 💥💥💥正解を10万に分けて、残りを出力します.💥💥💥

  • 必要
  • N

  • トラブルシューティング
  • まず、皆勤賞に専念すれば、Nにかかわらず
  • 合計1回以下遅刻💥💥 AND💥💥
  • 地殻0号
  • 地殻1号
  • 「以上」を3回連続して
  • 回欠席することはできない.
  • が状況の数にすぎないと考えると,3^N種の状況の数が生じる.でもNはせいぜい1000なので絶対無理です.
  • は、すべての場合に「直接生成」する問題ではありません.
  • つまり,単純な遡及では問題を解決できない.
  • 題では、10万の残りの部分を出力します.これは、段階的に解く過程で、10万の状況が発生する可能性があることを意味します.
  • のダイナミックプログラミングの問題のようです.ビーズ工芸の味がします.
  • {cache[i]は、i日に作成された最大数を表します.}これでは解決できないようです.
  • 多次元キャッシュを生成する必要がある場合があります.
  • i日の,{これまでの総遅刻回数A(最大1回)},{これまでi-1回欠席した回数B(連続最大2回)(すなわち,i-2からA,i-1からA,i-2からA,i-1からLを選択すると,iまで0を超えなければならない)}を選択し,{これまでの合計日}情報を受信する必要があります...
  • 状況を調べてみる
  • lateは0または1のみ
    absは0、1、2
  • のみ
  • absが0または1の場合-->absを超え、abs++
    absが2の場合-->現在のabsは使用できません.absは0を超えています.
    lateが0の場合-->現在もlateが可能で、late++が超え、absが0を超えています.(連続性が破られたため)
    lateが1の場合、-->現在のlateは絶対に不可能であり、元のlate(1)を超えています.
  • が統合されたら!現在、
    選択可能な場合:lateが0の場合のみ使用可能
    absは、absが0,1の場合に選択できます.
    Oが選択できる場合:以上の場合も完全に選択できます.
    「late」または「O」を選択した場合、-->absは0より大きい必要があります.
  • 「ビジネス工芸」という問題を考えました.あの問題を解いたところで、あの問題のように何とかしても思い出せない.DP問題は脆弱で,この問題にも長い時間がかかった.
  • また、この問題は資料型も考慮しなければならない.💥💥 longを使用しても値を超えるため、演算中に100万で割る必要があります.そのため、このようなプロセスを行います.
  • (a+b)%m=(a%m+b%m)%m.
  •     import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.util.*;
    
        public class Main{
    
            public static int n;
            public static long [][][] cache = new long[1001][2][3]; //  total, late, abs 이다. late는 0,1 가능 abs는 0,1,2 가능
            public static void Setting() throws IOException {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                n = Integer.parseInt(br.readLine());
                // Setting cache (value : -1)
                for(int i=0;i<cache.length;i++){
                    for(int j=0;j<cache[0].length;j++){
                        Arrays.fill(cache[i][j],-1);
                    }
                }
    
            }
            public static long dp(int total, int late, int abs){
                if(total == n) return 1;
                if(cache[total][late][abs]!=-1)return cache[total][late][abs];
                long sum = 0 ;
                long temp = 0;
    
                // late나 O 선택시, 지각 연속이 깨지는 것이기 때문에 abs에는 0이 오게 된다.
                // late는 전체에서 지각이 두 번 이상 있으면 안 되는 것 이기 때문에 , abs나 O를 선택한다고 late를 초기화시키진 않는다.
                // late 선택도 가능한 경우
                if(late == 0) {
    
                    temp = dp(total+1,late+1,0);
                    sum = proc(temp,sum);
                }
                // abs 선택도 가능한 경우 
                if(abs<2) {
                    temp=dp(total+1,late,abs+1);
                    sum = proc(temp,sum);
                }
                // O를 선택하는 경우
                temp = dp(total+1,late,0);
                sum = proc(temp,sum);
                cache[total][late][abs]=sum;
                //System.out.println("TOTAL "+total +", late: "+late+", abs: "+abs);
                System.out.println("cache[total][late][abs] = " + cache[total][late][abs]);
                return sum;
    
            }
            public static long proc(long temp, long sum){
                temp %=1000000;
                sum%=1000000;
                return (temp+sum)%1000000;
            }
    
            public static void main(String[] args) throws IOException{
                Setting();
                dp(0,0,0);
                System.out.println(cache[0][0][0]);
            }
    
        }
  • は依然として動的プログラミングの問題を解決することが難しい.今ではDPで解答しようと思っていますが、ビジネスプロセスの問題を解決した後も、この問題はすぐに解答方法を考え出せません.私は本当にDPが苦手なので、ちょうど选んだ问题はDPです!ちょうど私に必要な問題がこのように現れました!!幸せです!少なくともDPで解決しなければならない問題を思いついたので、今回は一人で解決して、必要な情報は何かを考えて、状況を共有しました.帰る流れが頭の中で思いつかないから答えはあるの?考えているうちに悩んでいる最終的にreturn 1によって蓄積される状況はまだ熟知していない.
  • 私にとって難題なら、私にとって難題です.多くの人が怒って諦めて、1週間後に終わりに来ますが、今日は3時間です.万一でも証明して解けるハハ...
  • 私は本当にDPが苦手なので、もっと解いてみます.