å¨æè§å(dynamic programming)æ¯è¿ç¹å¦çä¸ä¸ªåæ¯ï¼æ¯æ±è§£å³çè¿ç¨(decision process)æä¼åçæ°å¦æ¹æ³ã20ä¸çºª50年代åç¾å½æ°å¦å®¶R.E.Bellmanç人å¨ç 究å¤é¶æ®µå³çè¿ç¨(multistep decision process)çä¼åé®é¢æ¶ï¼æåºäºèåçæä¼ååç(principle of optimality)ï¼æå¤é¶æ®µè¿ç¨è½¬å为ä¸ç³»ååé¶æ®µé®é¢ï¼å©ç¨åé¶æ®µä¹é´çå
³ç³»ï¼é个æ±è§£ï¼åç«äºè§£å³è¿ç±»è¿ç¨ä¼åé®é¢çæ°æ¹æ³ââå¨æè§åã1957å¹´åºçäºä»çåèDynamic Programmingï¼è¿æ¯è¯¥é¢åç第ä¸æ¬èä½ã
æ¯ä¿¡æ¯å¦ç«èµä¸éæå¿
é¡»çç»ææ¡çä¸ç§ç®æ³,ä»ä»¥å
¶å¤å
æ§å¹¿ååºé¢è
çåç±.
ããå¨æè§åé¦æ¬¡è¿å
¥ä¿¡æ¯å¦å¥¥èµæ¯å¨IOI94ï¼æ°åä¸è§å½¢ï¼ï¼å¨å½å
é¦æ¬¡åºç°æ¯å¨NOI95ãæ¤åå¨æè§åæ为信æ¯å¦å¥¥èµçå¿
èç®æ³ä¹ä¸ã
ç¼è¾æ¬æ®µ
åç±»
ããå¨æè§åä¸è¬å¯å为线æ§å¨è§ï¼åºåå¨è§ï¼æ å½¢å¨è§ï¼èå
å¨è§åç±»ã
ãã举ä¾
线æ§å¨è§
ããæ¦æªå¯¼å¼¹ï¼åå±éå½¢ï¼æå°é·ç
åºåå¨è§
ããç³ååå¹¶ï¼ å åäºåæ ï¼ç»è®¡åè¯ä¸ªæ°ç
æ å½¢å¨è§
ããè´ªåçä¹å¤´é¾ï¼äºåæ¥æ¾æ ç
èå
é®é¢
ããè£
ç®±é®é¢ï¼æ¤ç奶ï¼åæµACM第1132é¢ï¼ç
ç¼è¾æ¬æ®µ
æ¦å¿µåæä¹
ããå¨æè§åé®ä¸ä»¥æ¥ï¼å¨ç»æµç®¡çãç产è°åº¦ãå·¥ç¨ææ¯åæä¼æ§å¶çæ¹é¢å¾å°äºå¹¿æ³çåºç¨ãä¾å¦æç路线ãåºå管çãèµæºåé
ã设å¤æ´æ°ãæåºãè£
è½½çé®é¢ï¼ç¨å¨æè§åæ¹æ³æ¯ç¨å
¶å®æ¹æ³æ±è§£æ´ä¸ºæ¹ä¾¿ã
ããè½ç¶å¨æè§å主è¦ç¨äºæ±è§£ä»¥æ¶é´ååé¶æ®µçå¨æè¿ç¨çä¼åé®é¢ï¼ä½æ¯ä¸äºä¸æ¶é´æ å
³çéæè§å(å¦çº¿æ§è§åãé线æ§è§å)ï¼åªè¦äººä¸ºå°å¼è¿æ¶é´å ç´ ï¼æå®è§ä¸ºå¤é¶æ®µå³çè¿ç¨ï¼ä¹å¯ä»¥ç¨å¨æè§åæ¹æ³æ¹ä¾¿å°æ±è§£ã
ããå¨æè§åç¨åºè®¾è®¡æ¯å¯¹è§£æä¼åé®é¢çä¸ç§éå¾ãä¸ç§æ¹æ³ï¼èä¸æ¯ä¸ç§ç¹æ®ç®æ³ãä¸è±¡åé¢æè¿°çé£äºæç´¢ææ°å¼è®¡ç®é£æ ·ï¼å
·æä¸ä¸ªæ åçæ°å¦è¡¨è¾¾å¼åæç¡®æ¸
æ°ç解é¢æ¹æ³ãå¨æè§åç¨åºè®¾è®¡å¾å¾æ¯é对ä¸ç§æä¼åé®é¢ï¼ç±äºåç§é®é¢çæ§è´¨ä¸åï¼ç¡®å®æä¼è§£çæ¡ä»¶ä¹äºä¸ç¸åï¼å èå¨æè§åç设计æ¹æ³å¯¹ä¸åçé®é¢ï¼æåå
·ç¹è²ç解é¢æ¹æ³ï¼èä¸åå¨ä¸ç§ä¸è½çå¨æè§åç®æ³ï¼å¯ä»¥è§£å³åç±»æä¼åé®é¢ãå æ¤è¯»è
å¨å¦ä¹ æ¶ï¼é¤äºè¦å¯¹åºæ¬æ¦å¿µåæ¹æ³æ£ç¡®ç解å¤ï¼å¿
é¡»å
·ä½é®é¢å
·ä½åæå¤çï¼ä»¥ä¸°å¯çæ³è±¡åå»å»ºç«æ¨¡åï¼ç¨åé æ§çæå·§å»æ±è§£ãæ们ä¹å¯ä»¥éè¿å¯¹è¥å¹²æ代表æ§çé®é¢çå¨æè§åç®æ³è¿è¡åæã讨论ï¼éæ¸å¦ä¼å¹¶ææ¡è¿ä¸è®¾è®¡æ¹æ³ã
ç¼è¾æ¬æ®µ
åºæ¬æ¨¡å
ããå¤é¶æ®µå³çè¿ç¨çæä¼åé®é¢ã
ããå«æéæ¨çææ³ä»¥ååç§æ°å¦åçï¼å æ³åçï¼ä¹æ³åçççï¼ã
ããå¨ç°å®çæ´»ä¸ï¼æä¸ç±»æ´»å¨çè¿ç¨ï¼ç±äºå®çç¹æ®æ§ï¼å¯å°è¿ç¨åæè¥å¹²ä¸ªäºç¸èç³»çé¶æ®µï¼å¨å®çæ¯ä¸é¶æ®µé½éè¦ä½åºå³çï¼ä»è使æ´ä¸ªè¿ç¨è¾¾å°æ好çæ´»å¨ææãå½ç¶ï¼å个é¶æ®µå³ççéåä¸æ¯ä»»æç¡®å®çï¼å®ä¾èµäºå½åé¢ä¸´çç¶æï¼åå½±å以åçåå±ï¼å½å个é¶æ®µå³çç¡®å®åï¼å°±ç»æä¸ä¸ªå³çåºåï¼å èä¹å°±ç¡®å®äºæ´ä¸ªè¿ç¨çä¸æ¡æ´»å¨è·¯çº¿ï¼å¦å¾æ示ï¼ï¼çè¯æ¡å¾ï¼ å¤é¶æ®µå³çé®é¢è¿ç§æä¸ä¸ªé®é¢çä½æ¯ä¸ä¸ªååå
³èå
·æé¾ç¶ç»æçå¤é¶æ®µè¿ç¨å°±ç§°ä¸ºå¤é¶æ®µå³çè¿ç¨ï¼è¿ç§é®é¢å°±ç§°ä¸ºå¤é¶æ®µå³çé®é¢ã
ç¼è¾æ¬æ®µ
åºæ¬ææ³
ããå¨æè§åç®æ³é常ç¨äºæ±è§£å
·ææç§æä¼æ§è´¨çé®é¢ãå¨è¿ç±»é®é¢ä¸ï¼å¯è½ä¼æ许å¤å¯è¡è§£ãæ¯ä¸ä¸ªè§£é½å¯¹åºäºä¸ä¸ªå¼ï¼æ们å¸ææ¾å°å
·ææä¼å¼ç解ãå¨æè§åç®æ³ä¸åæ²»æ³ç±»ä¼¼ï¼å
¶åºæ¬ææ³ä¹æ¯å°å¾
æ±è§£é®é¢å解æè¥å¹²ä¸ªåé®é¢ï¼å
æ±è§£åé®é¢ï¼ç¶åä»è¿äºåé®é¢ç解å¾å°åé®é¢ç解ãä¸åæ²»æ³ä¸åçæ¯ï¼éåäºç¨å¨æè§åæ±è§£çé®é¢ï¼ç»å解å¾å°åé®é¢å¾å¾ä¸æ¯äºç¸ç¬ç«çãè¥ç¨åæ²»æ³æ¥è§£è¿ç±»é®é¢ï¼åå解å¾å°çåé®é¢æ°ç®å¤ªå¤ï¼æäºåé®é¢è¢«éå¤è®¡ç®äºå¾å¤æ¬¡ãå¦ææ们è½å¤ä¿å已解å³çåé®é¢ççæ¡ï¼èå¨éè¦æ¶åæ¾åºå·²æ±å¾ççæ¡ï¼è¿æ ·å°±å¯ä»¥é¿å
大éçéå¤è®¡ç®ï¼èçæ¶é´ãæ们å¯ä»¥ç¨ä¸ä¸ªè¡¨æ¥è®°å½ææ已解çåé®é¢ççæ¡ãä¸ç®¡è¯¥åé®é¢ä»¥åæ¯å¦è¢«ç¨å°ï¼åªè¦å®è¢«è®¡ç®è¿ï¼å°±å°å
¶ç»æå¡«å
¥è¡¨ä¸ãè¿å°±æ¯å¨æè§åæ³çåºæ¬æè·¯ãå
·ä½çå¨æè§åç®æ³å¤ç§å¤æ ·ï¼ä½å®ä»¬å
·æç¸åçå¡«è¡¨æ ¼å¼ã
ç¼è¾æ¬æ®µ
åºæ¬ç»æ
ããå¤é¶æ®µå³çé®é¢ä¸ï¼å个é¶æ®µéåçå³çï¼ä¸è¬æ¥è¯´æ¯ä¸æ¶é´æå
³çï¼å³çä¾èµäºå½åç¶æï¼åéå³å¼èµ·ç¶æç转移ï¼ä¸ä¸ªå³çåºåå°±æ¯å¨ååçç¶æä¸äº§çåºæ¥çï¼æ
æâå¨æâçå«ä¹ï¼ç§°è¿ç§è§£å³å¤é¶æ®µå³çæä¼åé®é¢çæ¹æ³ä¸ºå¨æè§åæ¹æ³ã
ããå¨æè§åç¨åºè®¾è®¡æ¯å¯¹è§£æä¼åé®é¢çä¸ç§éå¾ãä¸ç§æ¹æ³ï¼èä¸æ¯ä¸ç§ç¹æ®ç®æ³ãä¸è±¡åé¢æè¿°çé£äºæç´¢ææ°å¼è®¡ç®é£æ ·ï¼å
·æä¸ä¸ªæ åçæ°å¦è¡¨è¾¾å¼åæç¡®æ¸
æ°ç解é¢æ¹æ³ãå¨æè§åç¨åºè®¾è®¡å¾å¾æ¯é对ä¸ç§æä¼åé®é¢ï¼ç±äºåç§é®é¢çæ§è´¨ä¸åï¼ç¡®å®æä¼è§£çæ¡ä»¶ä¹äºä¸ç¸åï¼å èå¨æè§åç设计æ¹æ³å¯¹ä¸åçé®é¢ï¼æåå
·ç¹è²ç解é¢æ¹æ³ï¼èä¸åå¨ä¸ç§ä¸è½çå¨æè§åï¼å¯ä»¥è§£å³åç±»æä¼åé®é¢ãå æ¤å¨å¦ä¹ æ¶ï¼é¤äºè¦å¯¹åºæ¬æ¦å¿µåæ¹æ³æ£ç¡®ç解å¤ï¼å¿
é¡»å
·ä½é®é¢å
·ä½åæå¤çï¼ä»¥ä¸°å¯çæ³è±¡åå»å»ºç«æ¨¡åï¼ç¨åé æ§çæå·§å»æ±è§£ã
ç¼è¾æ¬æ®µ
åºæ¬æ¨¡å
ããæ ¹æ®ä¸ä¾åæåå¨æè§åçåºæ¬æ¦å¿µï¼å¯ä»¥å¾å°å¨æè§åçåºæ¬æ¨¡åå¦ä¸ï¼
ãã(1)ç¡®å®é®é¢çå³ç对象ã (2)对å³çè¿ç¨ååé¶æ®µã (3)对åé¶æ®µç¡®å®ç¶æåéã (4)æ ¹æ®ç¶æåéç¡®å®è´¹ç¨å½æ°åç®æ å½æ°ã (5)建ç«åé¶æ®µç¶æåéç转移è¿ç¨ï¼ç¡®å®ç¶æ转移æ¹ç¨ã
ç¼è¾æ¬æ®µ
éç¨æ¡ä»¶
ããä»»ä½ææ³æ¹æ³é½æä¸å®çå±éæ§ï¼è¶
åºäºç¹å®æ¡ä»¶ï¼å®å°±å¤±å»äºä½ç¨ãåæ ·ï¼å¨æè§åä¹å¹¶ä¸æ¯ä¸è½çãéç¨å¨æè§åçé®é¢å¿
须满足æä¼ååçåæ åææ§ã
ãã1.æä¼ååçï¼æä¼åç»ææ§è´¨ï¼ æä¼ååçå¯è¿æ ·éè¿°ï¼ä¸ä¸ªæä¼åçç¥å
·æè¿æ ·çæ§è´¨ï¼ä¸è®ºè¿å»ç¶æåå³çå¦ä½ï¼å¯¹åé¢çå³çæå½¢æçç¶æèè¨ï¼ä½ä¸ç诸å³çå¿
é¡»æææä¼çç¥ãç®èè¨ä¹ï¼ä¸ä¸ªæä¼åçç¥çåçç¥æ»æ¯æä¼çãä¸ä¸ªé®é¢æ»¡è¶³æä¼ååçå称å
¶å
·ææä¼åç»ææ§è´¨ã
ãã2.æ åææ§ å°åé¶æ®µæç
§ä¸å®ç次åºæå好ä¹åï¼å¯¹äºæ个ç»å®çé¶æ®µç¶æï¼å®ä»¥ååé¶æ®µçç¶ææ æ³ç´æ¥å½±åå®æªæ¥çå³çï¼èåªè½éè¿å½åçè¿ä¸ªç¶æãæ¢å¥è¯è¯´ï¼æ¯ä¸ªç¶æé½æ¯è¿å»åå²çä¸ä¸ªå®æ´æ»ç»ãè¿å°±æ¯æ ååæ§ï¼å称为æ åææ§ã
ãã3.åé®é¢çéå æ§ å¨æè§åå°åæ¥å
·æææ°çº§å¤æ度çæç´¢ç®æ³æ¹è¿æäºå
·æå¤é¡¹å¼æ¶é´çç®æ³ãå
¶ä¸çå
³é®å¨äºè§£å³åä½ï¼è¿æ¯å¨æè§åç®æ³çæ ¹æ¬ç®çã å¨æè§åå®è´¨ä¸æ¯ä¸ç§ä»¥ç©ºé´æ¢æ¶é´çææ¯ï¼å®å¨å®ç°çè¿ç¨ä¸ï¼ä¸å¾ä¸åå¨äº§çè¿ç¨ä¸çåç§ç¶æï¼æ以å®ç空é´å¤æ度è¦å¤§äºå
¶å®çç®æ³ã
ç¼è¾æ¬æ®µ
ä½ç¨
ããå¨ç¼ç¨ä¸å¸¸ç¨è§£å³æé¿å
Œ
±ååºåé®é¢ãç©éµè¿ä¹é®é¢ãå¸å¤è¾¹å½¢æä¼ä¸è§ååé®é¢ãçµè·¯å¸çº¿çé®é¢ã
è®°å¿åæç´¢
ããç»ä½ ä¸ä¸ªæ°åä¸è§å½¢, å½¢å¼å¦ä¸:
ãã1
ãã2 3
ãã4 5 6
ãã7 8 9 10
ããæ¾åºä»ç¬¬ä¸å±å°æåä¸å±çä¸æ¡è·¯,使å¾æç»è¿çæå¼ä¹åæå°æè
æ大.
ããæ 论对äºæ°æè¿æ¯èæï¼è¿é½æ¯åçæä¸è¿çé¢äºï¼å¾å®¹æå°ï¼æ们ååºç¶æ转移æ¹ç¨ï¼f(i, j)=a[i, j] + min{f(i-1, j)ï¼f(i-1, j + 1)}
ãã对äºå¨æè§åç®æ³è§£å³è¿ä¸ªé®é¢ï¼æä»¬æ ¹æ®ç¶æ转移æ¹ç¨åç¶æ转移æ¹åï¼æ¯è¾å®¹æå°ååºå¨æè§åç循ç¯è¡¨ç¤ºæ¹æ³ãä½æ¯ï¼å½ç¶æå转移é常å¤æçæ¶åï¼ä¹è®¸ååºå¾ªç¯å¼çå¨æè§åå°±ä¸æ¯é£ä¹ç®åäºã
ãã解å³æ¹æ³ï¼
ããæ们å°è¯ä»æ£é¢çæè·¯å»åæé®é¢ï¼å¦ä¸ä¾ï¼ä¸é¾å¾åºä¸ä¸ªé常ç®åçéå½è¿ç¨:
ããf1=f(i+1,j+1); f2=f(i+1,j);
ããif(f1>f2) then f=f2+a[i,j]; else f=f1+a[i,j];
ããæ¾èæè§ï¼è¿ä¸ªç®æ³å°±æ¯æç®åçæç´¢ç®æ³ãæ¶é´å¤æ度为2^nï¼ææ¾æ¯ä¼è¶
æ¶çãåæä¸ä¸æç´¢çè¿ç¨ï¼å®é
ä¸ï¼å¾å¤è°ç¨é½æ¯ä¸å¿
è¦çï¼ä¹å°±æ¯æ产çè¿çæä¼ç¶æï¼å产çäºä¸æ¬¡ã为äºé¿å
浪费ï¼å¾æ¾ç¶ï¼æ们åæ¾ä¸ä¸ªoptæ°ç»ï¼Opt[i, j] - æ¯äº§çä¸ä¸ªf(i, j)ï¼å°f(i, j)çå¼æ¾å
¥optä¸ï¼ä»¥åå次è°ç¨å°f(i, j)çæ¶åï¼ç´æ¥ä»opt[i, j]æ¥åå°±å¯ä»¥äºãäºæ¯å¨æè§åçç¶æ转移æ¹ç¨è¢«ç´è§å°è¡¨ç¤ºåºæ¥äºï¼è¿æ ·èçäºæç»´çé¾åº¦ï¼åå°äºç¼ç¨çæå·§ï¼èè¿è¡æ¶é´åªæ¯ç¸å·®å¸¸æ°çå¤æ度ï¼é¿å
äºå¨æè§åç¶æ转移å
åçé®é¢ï¼èä¸å¨ç¸å½å¤çæ
åµä¸ï¼éå½ç®æ³è½æ´å¥½å°é¿å
浪费ï¼å¨æ¯èµä¸æ¯é常å®ç¨ç.
ãã并ä¸è®°å¿æç´¢å çå
åç¸å¯¹æ¥è¯´è¾å°
ãã计ç®æ ¸å¿ç段ï¼
ããfor(int i = n-1; i >= 1; --i) //ä»åæ°ç¬¬äºè¡å¼å§
ãã{
ããfor(int j=1; j <= i; j++)
ãã{
ããif (a[i+1][j][1] > a[i+1][j+1][1]) //左边大
ãã{
ããa[i][j][2] = 0; //éæ©å·¦è¾¹
ããa[i][j][1] += a[i+1][j][1];
ãã}
ããelse //å³è¾¹å¤§
ãã{
ããa[i][j][2] = 1; //éæ©å³è¾¹
ããa[i][j][1] += a[i+1][j+1][1];
ãã}
ãã}
ãã}
å³ç
ããå³çï¼
ããå½åç¶æéè¿å³ç,åå°äºä»¥åç¶æ.å¯è§å³çå
¶å®å°±æ¯ç¶æä¹é´çæ¡¥æ¢ãè以åç¶æä¹å°±å³å®äºå½åç¶æçæ
åµãæ°åä¸è§å½¢çå³çå°±æ¯éæ©ç¸é»ç两个以åç¶æçæä¼å¼ã
ç¶æ
ããç¶æï¼
ããæ们ä¸è¬å¨å¨è§çæ¶åæç¨å°çä¸äºæ°ç»ï¼ä¹å°±æ¯ç¨æ¥åå¨æ¯ä¸ªç¶æçæä¼å¼çãæ们就ä»å¨æè§åçè¦è¯ï¼ä¹å°±æ¯æ ¸å¿é¨åâç¶æâå¼å§ï¼æ¥éæ¥äºè§£å¨æè§åãææ¶åå½åç¶æç¡®å®å,以åç¶æ就已ç»ç¡®å®,åæ éæ举.
ãã
ç¼è¾æ¬æ®µ
åºç¨
ããä¸ãå¨æè§åçæ¦å¿µ
ãããè¿å¹´æ¥ï¼æ¶åå¨æè§åçåç§ç«èµé¢è¶æ¥è¶å¤ï¼æ¯ä¸å¹´çNOIå ä¹é½è³å°æä¸éé¢ç®éè¦ç¨å¨æè§åçæ¹æ³æ¥è§£å³ï¼èç«èµå¯¹éæè¿ç¨å¨æè§åç¥è¯çè¦æ±ä¹è¶æ¥è¶é«ï¼å·²ç»ä¸ååçäºç®åçéæ¨å建模ä¸äºã
ããè¦äºè§£å¨æè§åçæ¦å¿µï¼é¦å
è¦ç¥éä»ä¹æ¯å¤é¶æ®µå³çé®é¢ã
ãã1. å¤é¶æ®µå³çé®é¢
ããå¦æä¸ç±»æ´»å¨è¿ç¨å¯ä»¥å为è¥å¹²ä¸ªäºç¸èç³»çé¶æ®µï¼å¨æ¯ä¸ä¸ªé¶æ®µé½éä½åºå³ç(éåæªæ½)ï¼ä¸ä¸ªé¶æ®µçå³çç¡®å®ä»¥åï¼å¸¸å¸¸å½±åå°ä¸ä¸ä¸ªé¶æ®µçå³çï¼ä»èå°±å®å
¨ç¡®å®äºä¸ä¸ªè¿ç¨çæ´»å¨è·¯çº¿ï¼å称å®ä¸ºå¤é¶æ®µå³çé®é¢ã
ããå个é¶æ®µçå³çææä¸ä¸ªå³çåºåï¼ç§°ä¸ºä¸ä¸ªçç¥ãæ¯ä¸ä¸ªé¶æ®µé½æè¥å¹²ä¸ªå³çå¯ä¾éæ©ï¼å èå°±æ许å¤çç¥ä¾æ们éåï¼å¯¹åºäºä¸ä¸ªçç¥å¯ä»¥ç¡®å®æ´»å¨çææï¼è¿ä¸ªææå¯ä»¥ç¨æ°éæ¥ç¡®å®ãçç¥ä¸åï¼ææä¹ä¸åï¼å¤é¶æ®µå³çé®é¢ï¼å°±æ¯è¦å¨å¯ä»¥éæ©çé£äºçç¥ä¸é´ï¼éåä¸ä¸ªæä¼çç¥ï¼ä½¿å¨é¢å®çæ åä¸è¾¾å°æ好çææ.
ãã2ï¼å¨æè§åé®é¢ä¸çæ¯è¯
ããé¶æ®µï¼ææç»æ±è§£é®é¢çè¿ç¨æ°å½å°åæè¥å¹²ä¸ªç¸äºèç³»çé¶æ®µï¼ä»¥ä¾¿äºæ±è§£ï¼è¿ç¨ä¸åï¼é¶æ®µæ°å°±å¯è½ä¸åï¼æè¿°é¶æ®µçåé称为é¶æ®µåéãå¨å¤æ°æ
åµä¸ï¼é¶æ®µåéæ¯ç¦»æ£çï¼ç¨k表示ãæ¤å¤ï¼ä¹æé¶æ®µåéæ¯è¿ç»çæ
å½¢ãå¦æè¿ç¨å¯ä»¥å¨ä»»ä½æ¶å»ä½åºå³çï¼ä¸å¨ä»»æ两个ä¸åçæ¶å»ä¹é´å
许ææ ç©·å¤ä¸ªå³çæ¶ï¼é¶æ®µåéå°±æ¯è¿ç»çã
ããå¨åé¢çä¾åä¸ï¼ç¬¬ä¸ä¸ªé¶æ®µå°±æ¯ç¹Aï¼è第äºä¸ªé¶æ®µå°±æ¯ç¹Aå°ç¹Bï¼ç¬¬ä¸ä¸ªé¶æ®µæ¯ç¹Bå°ç¹Cï¼è第å个é¶æ®µæ¯ç¹Cå°ç¹Dã
ããç¶æï¼ç¶æ表示æ¯ä¸ªé¶æ®µå¼å§é¢ä¸´çèªç¶ç¶åµæ客è§æ¡ä»¶ï¼å®ä¸ä»¥äººä»¬ç主è§æå¿ä¸ºè½¬ç§»ï¼ä¹ç§°ä¸ºä¸å¯æ§å ç´ ãå¨ä¸é¢çä¾åä¸ç¶æå°±æ¯æé¶æ®µçåºåä½ç½®ï¼å®æ¢æ¯è¯¥é¶æ®µæè·¯çèµ·ç¹ï¼åæ¶åæ¯åä¸é¶æ®µææ¯è·¯çç»ç¹ã ä¸å¯æ§å ç´ å¨åé¢çä¾åä¸ï¼ç¬¬ä¸ä¸ªé¶æ®µæä¸ä¸ªç¶æå³Aï¼è第äºä¸ªé¶æ®µæ两个ç¶æB1åB2ï¼ç¬¬ä¸ä¸ªé¶æ®µæ¯ä¸ä¸ªç¶æC1ï¼C2åC3ï¼è第å个é¶æ®µåæ¯ä¸ä¸ªç¶æDã
ããè¿ç¨çç¶æé常å¯ä»¥ç¨ä¸ä¸ªæä¸ç»æ°æ¥æè¿°ï¼ç§°ä¸ºç¶æåéãä¸è¬ï¼ç¶ææ¯ç¦»æ£çï¼ä½ææ¶ä¸ºäºæ¹ä¾¿ä¹å°ç¶æåæè¿ç»çãå½ç¶ï¼å¨ç°å®çæ´»ä¸ï¼ç±äºåéå½¢å¼çéå¶ï¼ææçç¶æé½æ¯ç¦»æ£çï¼ä½ä»åæçè§ç¹ï¼ææ¶å°ç¶æä½ä¸ºè¿ç»çå¤çå°ä¼æå¾å¤§ç好å¤ãæ¤å¤ï¼ç¶æå¯ä»¥æå¤ä¸ªåé(å¤ç»´æ
å½¢)ï¼å èç¨åéæ¥ä»£è¡¨ï¼èä¸å¨æ¯ä¸ªé¶æ®µçç¶æç»´æ°å¯ä»¥ä¸åã ç¶æåéå½è¿ç¨æææå¯è½ä¸åçæ¹å¼åå±æ¶ï¼è¿ç¨å段çç¶æåéå°å¨æä¸ç¡®å®çèå´å
åå¼ãç¶æåéåå¼çéå称为ç¶æéåã
ããæ åææ§ï¼æ们è¦æ±ç¶æå
·æä¸é¢çæ§è´¨ï¼å¦æç»å®æä¸é¶æ®µçç¶æï¼åå¨è¿ä¸é¶æ®µä»¥åè¿ç¨çåå±ä¸åè¿é¶æ®µä»¥åå段ç¶æçå½±åï¼ææåé¶æ®µé½ç¡®å®æ¶ï¼æ´ä¸ªè¿ç¨ä¹å°±ç¡®å®äºãæ¢å¥è¯è¯´ï¼è¿ç¨çæ¯ä¸æ¬¡å®ç°å¯ä»¥ç¨ä¸ä¸ªç¶æåºå表示ï¼å¨åé¢çä¾åä¸æ¯é¶æ®µçç¶ææ¯è¯¥çº¿è·¯çå§ç¹ï¼ç¡®å®äºè¿äºç¹çåºåï¼æ´ä¸ªçº¿è·¯ä¹å°±å®å
¨ç¡®å®ãä»æä¸é¶æ®µä»¥åç线路å¼å§ï¼å½è¿ æ åææ§æ®µçå§ç¹ç»å®æ¶ï¼ä¸å以å线路ï¼æéè¿çç¹ï¼çå½±åãç¶æçè¿ä¸ªæ§è´¨æå³çè¿ç¨çåå²åªè½éè¿å½åçç¶æå»å½±åå®çæªæ¥çåå±ï¼è¿ä¸ªæ§è´¨ç§°ä¸ºæ åææ§ã
ããå³çï¼ä¸ä¸ªé¶æ®µçç¶æç»å®ä»¥åï¼ä»è¯¥ç¶ææ¼åå°ä¸ä¸é¶æ®µæ个ç¶æçä¸ç§éæ©ï¼è¡å¨ï¼ç§°ä¸ºå³çãå¨æä¼æ§å¶ä¸ï¼ä¹ç§°ä¸ºæ§å¶ãå¨è®¸å¤é®é¢ä¸ï¼å³çå¯ä»¥èªç¶èç¶å°è¡¨ç¤ºä¸ºä¸ä¸ªæ°æä¸ç»æ°ãä¸åçå³ç对åºçä¸åçæ°å¼ãæè¿°å³ççåé称å³çåéï¼å ç¶æ满足æ åææ§ï¼æ
å¨æ¯ä¸ªé¶æ®µéæ©å³çæ¶åªéèèå½åçç¶æèæ é¡»èèè¿ç¨çåå²ã
ããå³çåéçèå´ç§°ä¸ºå
许å³çéåã å
许å³çéåçç¥ï¼ç±æ¯ä¸ªé¶æ®µçå³çç»æçåºå称为çç¥ã对äºæ¯ä¸ä¸ªå®é
çå¤é¶æ®µå³çè¿ç¨ï¼å¯ä¾éåççç¥æä¸å®çèå´éå¶ï¼è¿ä¸ªèå´ç§°ä¸ºå
许çç¥éåãå
许çç¥ æä¼çç¥éåä¸è¾¾å°æä¼ææççç¥ç§°ä¸ºæä¼çç¥ã
ããç»å®ké¶æ®µç¶æåéx(k)çå¼åï¼å¦æè¿ä¸é¶æ®µçå³çåéä¸ç»ç¡®å®ï¼ç¬¬k+1é¶æ®µçç¶æåéx(k+1)ä¹å°±å®å
¨ç¡®å®ï¼å³x(k+1)çå¼éx(k)å第ké¶æ®µçå³çu(k)çå¼ååèååï¼é£ä¹ ç¶æ转移æ¹ç¨å¯ä»¥æè¿ä¸å
³ç³»çæ(x(k)ï¼u(k))ä¸x(k+1)ç¡®å®ç对åºå
³ç³»ï¼ç¨x(k+1)=Tk(x(k),u(k))表示ãè¿æ¯ä»ké¶æ®µå°k+1é¶æ®µçç¶æ转移è§å¾ï¼ç§°ä¸ºç¶æ转移æ¹ç¨ã
ããæä¼ååç:ä½ä¸ºæ´ä¸ªè¿ç¨çæä¼çç¥ï¼å®æ»¡è¶³ï¼ç¸å¯¹åé¢å³çæå½¢æçç¶æèè¨ï¼ä½ä¸çåçç¥å¿
ç¶ææâæä¼åçç¥âãä¸ä¸ªé®é¢æ»¡è¶³æä¼ååçä¹ç§°å
¶æ¥ææä¼åç»ææ§è´¨ã
ããæä¼æ§åçå®é
ä¸æ¯è¦æ±é®é¢çæä¼çç¥çåçç¥ä¹æ¯æä¼ã让æ们éè¿å¯¹åé¢çä¾åååææ¥å
·ä½è¯´æè¿ä¸ç¹ï¼ä»Aå°Dï¼æ们ç¥éï¼æçè·¯å¾æ¯AB1C2Dï¼è¿äºç¹çéæ©ææäºè¿ä¸ªä¾åçæä¼çç¥ï¼æ ¹æ®æä¼æ§åçï¼è¿ä¸ªçç¥çæ¯ä¸ªåçç¥åºæ¯æä¼ï¼ æä¼ååçAB1C2æ¯Aå°C2çæçè·¯å¾ï¼B1C2Dä¹æ¯B1å°Dçæçè·¯å¾â¦â¦ââäºå®æ£æ¯å¦æ¤ï¼å æ¤æ们认为è¿ä¸ªä¾å满足æä¼æ§åççè¦æ±ã
ç¼è¾æ¬æ®µ
å¨æè§åç»ä¹ é¢
ããUSACO
ãã2.2 Subset Sums
ããé¢ç®å¦ä¸ï¼
ãã对äºä»1å°Nçè¿ç»æ´æ°éåï¼è½ååæ两个åéåï¼ä¸ä¿è¯æ¯ä¸ªéåçæ°ååæ¯ç¸ççã
ãã举个ä¾åï¼å¦æN=3ï¼å¯¹äº{1ï¼2ï¼3}è½ååæ两个åéåï¼ä»ä»¬æ¯ä¸ªçæææ°ååæ¯ç¸ççï¼
ãã{3}and {1,2}
ããè¿æ¯å¯ä¸ä¸ç§ååï¼äº¤æ¢éåä½ç½®è¢«è®¤ä¸ºæ¯åä¸ç§ååæ¹æ¡ï¼å æ¤ä¸ä¼å¢å ååæ¹æ¡æ»æ°ï¼
ããå¦æN=7ï¼æåç§æ¹æ³è½ååéå{1ï¼2ï¼3ï¼4ï¼5ï¼6ï¼7}ï¼æ¯ä¸ç§ååçåéååæ°ååæ¯ç¸çç:
ãã{1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5}
ãã{2,5,7} and {1,3,4,6}
ãã{3,4,7} and {1,2,5,6}
ãã{1,2,4,7} and {3,5,6}
ããç»åºNï¼ä½ çç¨åºåºè¯¥è¾åºååæ¹æ¡æ»æ°ï¼å¦æä¸åå¨è¿æ ·çååæ¹æ¡ï¼åè¾åº0ãç¨åºä¸è½é¢åç»æç´æ¥è¾åºã
ããPROGRAM NAME: subset
ããINPUT FORMAT
ããè¾å
¥æ件åªæä¸è¡ï¼ä¸åªæä¸ä¸ªæ´æ°N
ããSAMPLE INPUT (file subset . in)
ãã7
ããOUTPUT FORMAT
ããè¾åºååæ¹æ¡æ»æ°ï¼å¦æä¸åå¨åè¾åº0ã
ããSAMPLE OUTPUT (file subset.out)
ãã4
ããåèç¨åºå¦ä¸ï¼C++è¯è¨ï¼ï¼
ãã#include <fstream>
ããusing namespace std;
ããconst unsigned int MAX_SUM = 1024;
ããint n;
ããunsigned long long int dyn[MAX_SUM];
ããifstream fin ("subset. in");
ããofstream fout ("subset.out");
ããint main() {
ããfin >> n;
ããfin.close();
ããint s = n*(n+1);
ããif (s % 4) {
ããfout << 0 << endl;
ããfout.close ();
ããreturn ;
ãã}
ããs /= 4;
ããint i, j;
ããdyn [0] = 1;
ããfor (i = 1; i <= n; i++)
ããfor (j = s; j >= i; j--)
ããdyn[j] += dyn[j-i];
ããfout << (dyn[s]/2) << endl;
ããfout.close();
ããreturn 0;
ãã}
ããUSACO 2.3
ããLongest Prefix
ããé¢ç®å¦ä¸ï¼
ããå¨çç©å¦ä¸ï¼ä¸äºçç©çç»ææ¯ç¨å
å«å
¶è¦ç´ ç大ååæ¯åºåæ¥è¡¨ç¤ºçãçç©å¦å®¶å¯¹äºæé¿çåºåå解æè¾ççï¼ç§°ä¹ä¸ºå
ç´ çï¼åºåå¾æå
´è¶£ã
ããå¦æä¸ä¸ªéå P ä¸çå
ç´ å¯ä»¥éè¿å¹¶è¿ç®ï¼å
许éå¤ï¼å¹¶ï¼å³âªï¼ç¸å½äº Pascal ä¸ç â+â è¿ç®ç¬¦ï¼ç»æä¸ä¸ªåºå S ï¼é£ä¹æ们认为åºå S å¯ä»¥å解为 P ä¸çå
ç´ ã并ä¸æ¯ææçå
ç´ é½å¿
é¡»åºç°ã举个ä¾åï¼åºå ABABACABAAB å¯ä»¥å解为ä¸é¢éåä¸çå
ç´ ï¼
ãã{A, AB, BA, CA, BBC}
ããåºå S çåé¢ K 个åç¬¦ç§°ä½ S ä¸é¿åº¦ä¸º K çåç¼ã设计ä¸ä¸ªç¨åºï¼è¾å
¥ä¸ä¸ªå
ç´ éå以åä¸ä¸ªå¤§ååæ¯åºåï¼è®¡ç®è¿ä¸ªåºåæé¿çåç¼çé¿åº¦ã
ããPROGRAM NAME: prefix
ããINPUT FORMAT
ããè¾å
¥æ°æ®çå¼å¤´å
æ¬ 1..200 个å
ç´ ï¼é¿åº¦ä¸º 1..10 ï¼ç»æçéåï¼ç¨è¿ç»çä»¥ç©ºæ ¼åå¼çå符串表示ãåæ¯å
¨é¨æ¯å¤§åï¼æ°æ®å¯è½ä¸æ¢ä¸è¡ãå
ç´ éåç»æçæ å¿æ¯ä¸ä¸ªåªå
å«ä¸ä¸ª â.â çè¡ãéåä¸çå
ç´ æ²¡æéå¤ãæ¥çæ¯å¤§ååæ¯åºå S ï¼é¿åº¦ä¸º 1..200,000 ï¼ç¨ä¸è¡æè
å¤è¡çå符串æ¥è¡¨ç¤ºï¼æ¯è¡ä¸è¶
è¿ 76 个å符ãæ¢è¡ç¬¦å¹¶ä¸æ¯åºå S çä¸é¨åã
ããSAMPLE INPUT (file prefix. in)
ããA AB BA CA BBC
ãã.
ããABABACABAABC
ããOUTPUT FORMAT
ããåªæä¸è¡ï¼è¾åºä¸ä¸ªæ´æ°ï¼è¡¨ç¤º S è½å¤å解æ P ä¸å
ç´ çæé¿åç¼çé¿åº¦ã
ããSAMPLE OUTPUT (file prefix.out)
ãã11
ãã示ä¾ç¨åºå¦ä¸ï¼
ãã#include <stdio.h>
ãã/* maximum number of primitives */
ãã#define MAXP 200
ãã/* maximum length of a primitive */
ãã#define MAXL 10
ããchar prim[MAXP+1][MAXL+1]; /* primitives */
ããint nump; /* number of primitives */
ããint start[200001]; /* is this prefix of the sequence expressible? */
ããchar data[200000]; /* the sequence */
ããint ndata; /* length of the sequence */
ããint main(int argc, char **argv)
ãã{
ããFILE *fout, *fin;
ããint best;
ããint lv, lv2, lv3;
ããif ((fin = fopen("prim. in", "r")) == NULL)
ãã{
ããperror ("fopen fin");
ããexit(1);
ãã}
ããif ((fout = fopen("prim.out", "w")) == NULL)
ãã{
ããperror ("fopen fout");
ããexit(1);
ãã}
ãã/* read in primitives */
ããwhile (1)
ãã{
ããfscanf (fin, "%s", prim[nump]);
ããif (prim[nump][0] != '.') nump++;
ããelse break;
ãã}
ãã/* read in string, one line at a time */
ããndata = 0;
ããwhile (fscanf (fin, "%s", data+ndata) == 1)
ããndata += strlen(data+ndata);
ããstart[0] = 1;
ããbest = 0;
ããfor (lv = 0; lv < ndata; lv++)
ããif (start[lv])
ãã{ /* for each expressible prefix */
ããbest = lv; /* we found a longer expressible prefix! */
ãã/* for each primitive, determine the the sequence starting at
ããthis location matches it */
ããfor (lv2 = 0; lv2 < nump; lv2++)
ãã{
ããfor (lv3 = 0; lv + lv3 < ndata && prim[lv2][lv3] &&
ããprim[lv2][lv3] == data[lv+lv3]; lv3++)
ãã;
ããif (!prim[lv2][lv3]) /* it matched! */
ããstart[lv + lv3] = 1; /* so the expanded prefix is also expressive */
ãã}
ãã}
ãã/* see if the entire sequence is expressible */
ããif (start[ndata]) best = ndata;
ããfprintf (fout, "%i\n", best);
ããreturn 0;
ãã}
ããUSACO 3.1
ããScore Inflation
ããé¢ç®å¦ä¸ï¼
ããæ们è¯ç设计æ们çç«èµä»¥ä¾¿äººä»¬è½å°½å¯è½çå¤å¾å,è¿éè¦ä½ ç帮å©ã
ããæ们å¯ä»¥ä»å 个ç§ç±»ä¸éåç«èµçé¢ç®,è¿éçä¸ä¸ª"ç§ç±»"æ¯æä¸ä¸ªç«èµé¢ç®çéå,解å³éåä¸çé¢ç®éè¦ç¸åå¤çæ¶é´å¹¶ä¸è½å¾å°ç¸åçåæ°ã
ããä½ çä»»å¡æ¯åä¸ä¸ªç¨åºæ¥åè¯USACOçèå,åºè¯¥ä»æ¯ä¸ä¸ªç§ç±»ä¸éåå¤å°é¢ç®,使å¾è§£å³é¢ç®çæ»èæ¶å¨ç«èµè§å®çæ¶é´é并ä¸æ»åæ大ã
ããè¾å
¥å
æ¬ç«èµçæ¶é´,M(1 <= M <= 10,000)åN,"ç§ç±»"çæ°ç®1 <= N <= 10,000ã
ããåé¢çæ¯ä¸è¡å°å
æ¬ä¸¤ä¸ªæ´æ°æ¥æè¿°ä¸ä¸ª"ç§ç±»":
ãã第ä¸ä¸ªæ´æ°è¯´æ解å³è¿ç§é¢ç®è½å¾çåæ°(1 <= points <= 10000),第äºæ´æ°è¯´æ解å³è¿ç§é¢ç®æéçæ¶é´(1 <= minutes <= 10000)ã
ããä½ çç¨åºåºè¯¥ç¡®å®æ们åºè¯¥ä»æ¯ä¸ª"ç§ç±»"ä¸éå¤å°éé¢ç®ä½¿å¾è½å¨ç«èµçæ¶é´ä¸å¾å°æ大çåæ°ã
ããæ¥èªä»»æç"ç§ç±»"çé¢ç®æ°ç®å¯è½ä»»ä½éè´æ°(0ææ´å¤)ã
ãã计ç®å¯è½å¾å°çæ大åæ°ã
ããPROGRAM NAME: inflate
ããINPUT FORMAT
ãã第 1 è¡: M, N--ç«èµçæ¶é´åé¢ç®"ç§ç±»"çæ°ç®ã
ãã第 2-N+1 è¡: 两个æ´æ°:æ¯ä¸ª"ç§ç±»"é¢ç®çåæ°åèæ¶ã
ããSAMPLE INPUT (file inflate .in)
ãã300 4
ãã100 60
ãã250 120
ãã120 100
ãã35 20
ããOUTPUT FORMAT
ããåç¬çä¸è¡å
æ¬é£ä¸ªå¨ç»å®çéå¶éå¯è½å¾å°çæ大çåæ°ã
ããSAMPLE OUTPUT (file inflate.out)
ãã605
ãã{ä»ç¬¬2个"ç§ç±»"ä¸é两é¢ï¼ç¬¬4个"ç§ç±»"ä¸éä¸é¢}
ãã示ä¾ç¨åºå¦ä¸ï¼
ãã#include <fstream.h>
ããifstream fin("inflate .in");
ããofstream fout("inflate.out");
ããconst short maxm = 10010;
ããlong best[maxm], m, n;
ããvoid
ããmain()
ãã{
ããshort i, j, len, pts;
ããfin >> m >> n;
ããfor (j = 0; j <= m; j++)
ããbest[j] = 0;
ããfor (i = 0; i < n; i++) {
ããfin >> pts >> len;
ããfor (j = len; j <= m; j++)
ããif (best[j-len] + pts > best[j])
ããbest[j] = best[j-len] + pts;
ãã}
ããfout << best[m] << endl; // ç±äºæ°ç»å
ç´ ä¸åï¼æ«å
ç´ æ大
ãã}
ããUSACO 3.3
ããA Game
ããé¢ç®å¦ä¸ï¼
ããæå¦ä¸ä¸ä¸ªå人游æ:N(2 <= N <= 100)个æ£æ´æ°çåºåæ¾å¨ä¸ä¸ªæ¸¸æå¹³å°ä¸ï¼ä¸¤äººè½®æµä»åºåç两端åæ°ï¼åæ°å该æ°å被å»æ并累å å°æ¬ç©å®¶çå¾åä¸ï¼å½æ°åå°½æ¶ï¼æ¸¸æç»æã以æç»å¾åå¤è
为èã
ããç¼ä¸ä¸ªæ§è¡æä¼çç¥çç¨åºï¼æä¼çç¥å°±æ¯ä½¿èªå·±è½å¾å°å¨å½åæ
åµä¸æ大çå¯è½çæ»åççç¥ãä½ çç¨åºè¦å§ç»ä¸ºç¬¬äºä½ç©å®¶æ§è¡æä¼çç¥ã
ããPROGRAM NAME: game1
ããINPUT FORMAT
ãã第ä¸è¡: æ£æ´æ°N, 表示åºåä¸æ£æ´æ°ç个æ°ã
ãã第äºè¡è³æ«å°¾: ç¨ç©ºæ ¼åéçN个æ£æ´æ°ï¼å¤§å°ä¸º1-200ï¼ã
ããSAMPLE INPUT (file game1.in)
ãã6
ãã4 7 2 9
ãã5 2
ããOUTPUT FORMAT
ããåªæä¸è¡ï¼ç¨ç©ºæ ¼åéç两个æ´æ°: ä¾æ¬¡ä¸ºç©å®¶ä¸åç©å®¶äºæç»çå¾åã
ããSAMPLE OUTPUT (file game1.out)
ãã18 11
ããåèç¨åºå¦ä¸ï¼
ãã#include <stdio.h>
ãã#define NMAX 101
ããint best[NMAX][2], t[NMAX];
ããint n;
ããvoid
ããreadx () {
ããint i, aux;
ããfreopen ("game1.in", "r", stdin);
ããscanf ("%d", &n);
ããfor (i = 1; i <= n; i++) {
ããscanf ("%d", &aux);
ããt= t[i - 1] + aux;
ãã}
ããfclose (stdin);
ãã}
ããinline int
ããmin (int x, int y) {
ããreturn x > y ? y : x;
ãã}
ããvoid
ããsolve () {
ããint i, l;
ããfor (l = 1; l <= n; l++)
ããfor (i = 1; i + l <= n + 1; i++)
ããbest[l%2] = t[i + l - 1] - t[i - 1] - min (best[i + 1][(l - 1) % 2],
ããbest[(l - 1) % 2]);
ãã}
ããvoid writex () {
ããfreopen ("game1.out", "w", stdout);
ããprintf ("%d %d\n", best[1][n % 2], t[n] - best[1][n % 2]);
ããfclose (stdout);
ãã}
ããint
ããmain () {
ããreadx ();
ããsolve ();
ããwritex ();
ããreturn 0;
ãã}
ããUSACO 3.4
ããRaucous Rockers
温馨提示:答案为网友推荐,仅供参考