ไก่ข้ามถนนได้อย่างไร


16

ส่งเสียงกระต๊าก ไม่มีใครรู้ว่าทำไมไก่ถึงข้ามถนนบางทีอาจมีไก่ที่ดูดีอยู่อีกด้านหนึ่ง แต่เราสามารถหาวิธีได้ เขียนโปรแกรมที่จากซ้ายไปขวาข้าม "ถนน" นี้ (หรือใด ๆ )

1356 | 1738
3822 | 1424
3527   3718
9809 | 5926
0261 | 1947
7188   4717
6624 | 9836
4055 | 9164
2636   4927
5926 | 1964
3144 | 8254

โปรแกรมของคุณ "ข้าม" โดยเลื่อนจากซ้ายไปขวา คุณเริ่มจากหมายเลขใดก็ได้ในคอลัมน์ซ้ายสุดที่คุณต้องการ จากตรงนั้นคุณสามารถย้ายไปยังอักขระที่อยู่ติดกันทางด้านขวา หากคุณเริ่มต้นที่มุมซ้ายบน 1 คุณสามารถไปที่ 3 หรือ 8 ทุกหมายเลขที่คุณไปรวมถึงหมายเลขเริ่มต้นจะถูกเพิ่มลงในผลรวม ช่องว่างไม่ได้เพิ่มในผลรวมของคุณ "|" บังคับให้คุณเลื่อนขึ้นหรือลงแทนที่จะไปทางขวา (คุณไม่สามารถก้าวไปข้างหน้ากับตัวละครนี้ได้) เป้าหมายของคุณคือไปที่อีกด้านหนึ่งด้วยผลรวมที่น้อยที่สุด โปรแกรมของคุณจะต้องพิมพ์ผลรวมในตอนท้ายและจะต้องสามารถแก้ไขถนนใด ๆ โดยเฉพาะอย่างยิ่งมันอาจมีอินพุตสำหรับถนน แต่ไม่จำเป็น โปรแกรมของคุณจะต้องพิมพ์ทั้งเส้นทางและผลรวม จำนวนไบต์ของโค้ดที่น้อยที่สุดชนะ

เพื่อชี้แจงคุณสามารถย้ายการวินิจฉัยยกเว้นว่าคุณอยู่บนแถบแนวตั้ง คุณสามารถเลื่อนขึ้นและลงเมื่ออยู่บนแถบแนวตั้งเท่านั้น

สำหรับสเปคที่ชัดเจนของถนนมันเป็นสตริงของข้อความ (หรืออาเรย์ของคอลัมน์หรือแถวหากคุณต้องการคิดแบบนั้น) ที่เป็นไปตามกฎของตัวละครและไม่มีอะไร แต่ตัวละครเหล่านั้นใน ถนน. อาจมีจำนวนใด ๆ ช่องว่างบาร์ ("|") หรือขึ้นบรรทัดใหม่ หากถนนถูกปูด้วยคนเมาเช่นเดียวกับคำตอบของ ProgrammerDan ก็ยังคงเป็นถนนที่ถูกต้องและโปรแกรมของคุณจะต้องสามารถแก้ไขถนนดังกล่าวได้ มันจะไม่ถือว่าเป็นถนนถ้าเป็นไปไม่ได้ที่จะเดินทางไปอีกฝั่งหนึ่ง (ตัวอย่างเช่นไม่มีทางที่จะแยกเป็นเส้นตรง)

โปรแกรมของคุณไม่จำเป็นต้องพิจารณาว่าถนนนั้นไม่ถูกต้องหรือไม่

คีย์:
หมายเลขใด ๆ - เพิ่มหมายเลขให้กับผลรวมของคุณย้ายไปข้างหน้า
Space - เลื่อนไปข้างหน้าไม่มีอะไรเพิ่มในผลรวมของคุณ
"|" - เลื่อนขึ้นหรือลงไม่มีอะไรเพิ่มลงในผลรวมของคุณ

แก้ไข: ตัวอย่างโซลูชั่นตามที่แนะนำ ฉันไม่สามารถทำให้มันใหญ่โตอย่างน่ากลัวได้ฉันไม่สามารถใช้ IDE เพื่อแก้ปัญหาให้ฉันได้

ใช้ถนนสายเล็ก ๆ นี้:

9191 | 8282
1919 | 2727
5555   5555

การแก้ปัญหาจะเป็นเส้นทาง 1, 1, 1, 1, ช่องว่าง, ตัวหาร, ตัวแบ่ง, ช่องว่าง, ช่องว่าง, 2, 2, 2, 2, 2 รวมเป็น 12

แก้ไข # 2: ทางออกสู่ถนนสายแรกในคำถามนี้ซึ่งกำหนดโดยโปรแกรม Geobits และประชาชนคือ 0,2,0,1,,,,,, 1,4,1,4 รวมเป็น 13


4
คุณสามารถรวมกรณีทดสอบอย่างน้อยหนึ่งกรณีด้วยโซลูชันที่ถูกต้องได้หรือไม่? นอกจากนี้อาจมีมากกว่าสาม|ในแถว?
Martin Ender

1
@ timmy คุณสามารถเคลื่อนที่ในแนวทแยงมุมได้ตราบใดที่มันเคลื่อนที่ไปข้างหน้า สามารถสัมผัสกับการเคลื่อนไหวในแนวทแยงสองสามครั้ง
CaffeineToCode

3
@ mbomb007 ถ้าเริ่มต้นที่มุมบน เนื่องจากคุณสามารถเริ่มต้นในคอลัมน์ซ้ายคุณจะได้รับ0,2,0,1, , , ,1,4,1,4 -> 13
Geobits

1
ใช่. คุณสามารถเลื่อนขึ้นหรือลงบนบาร์เท่านั้นเพื่อให้คุณสามารถออกไปจากที่ว่างได้
CaffeineToCode

1
สำหรับผลลัพธ์เพียงแค่พอเพียงด้านต้นทุนหรือเส้นทางทั้งหมดต้องเป็นผลลัพธ์หรือไม่
ProgrammerDan

คำตอบ:


3

Pyth, 168 143 141 bytes [เข้ากันได้กับ Drunken Road]

กรณีทดสอบของฉันใช้งานได้ แต่เนื่องจากความเข้าใจผิดในส่วนของฉันมันจึงไม่สามารถทำงานได้อย่างถูกต้องกับตัวอย่างเริ่มต้น ฉันกำลังแก้ไขมันอยู่

ตอนนี้ทำงานเพื่อเป็นตัวอย่างดั้งเดิมและเมาเหล้าบนถนน

บาง รหัสน่าเกลียดน้อยจริงๆจริงๆ :

=Z.dC,++\ `MUT\|++0UT=^T5Ltu+G]?&qeeG\|<heGhH+eGeHHtb,0hbKhohNum++hed@ZhhdtedC,H_y_y.b+N]YmhohNd.:++TGT3HCm.[d\ lh.MlZ.z.z*hl.z]]0j\,t.sK\ hK

ทดสอบที่นี่

ฉันทดสอบบนถนน 10 + 9 x 40

6417443208|153287613
8540978161|726772300
7294922506 263609552
0341937695 498453099
9417989188 370992778
2952186385|750207767
7049868670 756968872
1961508589|379453595
0670474005 070712970
4817414691|670379248
0297779413|980515509
6637598208 090265179
6872950638 767270459
7375626432 439957105
1387683792|544956696
6974831376 545603884
0949220671|632555651
3952970630|379291361
0456363431|275612955
2973230054|830527885
5328382365|989887310
4034587060 614168216
4487052014|969272974
5015479667 744253705
5756698090|621187161
9444814561|169429694
7697999461|477558331
3822442188 206942845
2787118311|141642208
2669534759 308252645
6121516963|554616321
5509428225|681372307
6619817314|310054531
1759758306 453053985
9356970729|868811209
4208830142 806643228
0898841529|102183632
9692682718|103744380
5839709581|790845206
7264919369|982096148

เพียงแค่ทราบการรับ "IndexError: รายการดัชนีอยู่นอกช่วง" เมื่อเรียกใช้โดยใช้ชุดทดสอบที่ให้ไว้
ProgrammerDan

@Programmer ทำเช่นนั้น I.
CaffeineToCode

1
@CaffeineToCode จริง แต่เพิ่มแนวคิดของ "ถนนเมา" หลังจากที่ฉันส่ง มันจะช่วยได้มากหากรู้ว่าถนนประกอบด้วยอะไร จากตัวอย่างฉันถือว่า 2 ด้านพร้อมคอลัมน์แบ่ง
Brian Tuck

1
@CaffeineToCode หนึ่งในวิธีที่ดีที่สุดในการเขียนคำถามที่ดีคือการเขียนตัวอย่างเพิ่มเติม - แม้ไม่มีวิธีแก้ปัญหา หากความกว้างของตัวแปรหรือถนนหลายเลนนั้นถูกต้องตัวอย่างหนึ่ง "บ้า" จะแสดงให้เห็นโดยไม่มีข้อความอธิบายเพิ่มเติม
ProgrammerDan

1
@ProgrammerDan คุณขอมัน ของฉันตอนนี้เข้ากันได้กับ DR (และสั้นกว่า ... เดาสิว่าฉันกำลังจับอยู่)
Brian Tuck

4

Java, 955 ไบต์

เห็นได้ชัดว่าจะไม่ชนะรางวัลใด ๆ เป็น Java และทั้งหมด แต่ฉันรักปัญหานี้และต้องการที่จะโยนในรายการของตัวเอง

คุณสมบัติและข้อ จำกัด :

  • สามารถรองรับถนนที่ผิดปกติ (เกินจริง!) รวมถึงความกว้างของตัวแปรเส้นที่ซับซ้อน ฯลฯ
  • คาดว่าถนนที่จะป้อนเป็นพารามิเตอร์ในการดำเนินการ; รุ่น ungolfed ยังรองรับการอ่านจาก stdin แต่เนื่องจากวิธีการป้อนข้อมูลไม่ได้ระบุรุ่น golfed คาดว่าเล็กที่สุด!
  • ใช้เทคนิคการเขียนโปรแกรมแบบไดนามิกบางอย่างที่ฉันไม่ได้ใช้ใน, โอ้, 6 ปีหรือมากกว่านั้นเพื่อแก้ปัญหาอย่างมีประสิทธิภาพในเวลา O (n * m) โดยที่ n คือแถวและ m คือคอลัมน์
    • แก้จากขวาไปซ้ายเครื่องหมายทิศทางที่ดีที่สุดที่จะจากดัชนีปัจจุบันไปยังดัชนีถัดไป
    • "lines" ได้รับการจัดการโดยการแก้ไขคอลัมน์ของพวกเขาจากนั้นระบุที่อยู่หากสามารถเข้าถึงได้ในคอลัมน์ถัดไป พวกเขาแก้ไขได้ด้วยการจัดเก็บทิศทางขึ้นหรือลงด้วยค่าใช้จ่ายของผู้ที่ไม่สามารถติดต่อได้ในที่สุด
  • แทร็ก แต่ไม่ได้พิมพ์ (ในเวอร์ชัน golf'd) ดัชนีเริ่มต้นของทางออกที่ดีที่สุด

ตกลงพอ jibba jabba รุ่น Golfed:

class C{public static void main(String[]a){int n=a.length,m=0,i=0,j=0,h=0,p=0,q=0,s=0,t=0,b=-1,c=2147483647,x=0,y=0;char[][]r=new char[n][];char u;for(String k:a){j=k.length();m=(j>m)?j:m;}for(String k:a)r[i++]=java.util.Arrays.copyOf(k.toCharArray(),m);int[][][]d=new int[n][m][2];for(j=m-1;j>=0;j--){for(i=0;i<n;i++){u=r[i][j];p=(u=='\0'||u==' '||u=='|'?0:u-'0');if(j==m-1)d[i][j][1]=p;else{if(u=='|')d[i][j][0]=-1;else{for(h=-1;h<2;h++){x=i+h;y=j+1;if(x>=0&&x<n){if(d[x][y][0]==-1){s=x-1;while(s>=0&&r[s][y]=='|')s--;t=x+1;while(t<n&&r[t][y]=='|')t++;if((s>=0&&t<n&&d[s][y][1]<d[t][y][1])||(s>=0&&t>=n)){t=d[s][y][1];s=4;}else{s=6;t=d[t][y][1];}d[x][y][0]=s;d[x][y][1]=t;}q=d[x][y][1]+p;if(d[i][j][0]==0||q<d[i][j][1]){d[i][j][0]=h+2;d[i][j][1]=q;}}}}}if(j==0&&(b<0||d[i][j][1]<c)){b=i;c=d[i][j][1];}}}String o="";i=b;j=0;while(j<m){u=r[i][j];if(u=='\0')j=m;else{o+=u+",";h=d[i][j][0]-2;if(h>1)i+=h-3;else{i+=h;j++;}}}System.out.println(o+"\b:"+c);}}

ตามนิสัยของฉันGitHub กับรหัส ungolfedด้วยรหัส

โซลูชันสำหรับถนน "แรก":

$ java C "1356 | 1738" "3822 | 1424" "3527   3718" "9809 | 5926" "0261 | 1947" "7188   4717" "6624 | 9836" "4055 | 9164" "2636   4927" "5926 | 1964" "3144 | 8254"
0,2,0,1, , , ,1,4,1,4:13

ตัวอย่างที่สอง:

$ java C "9191 | 8282" "1919 | 2727" "5555   5555"
1,1,1,1, ,|,|, , ,2,2,2,2:12

ตัวอย่างของ Brian Tuck:

$ java C "6417443208|153287613" "8540978161|726772300" "7294922506 263609552" "0341937695 498453099" "9417989188 370992778" "2952186385|750207767" "7049868670 756968872" "1961508589|379453595" "0670474005 070712970" "4817414691|670379248" "0297779413|980515509" "6637598208 090265179" "6872950638 767270459" "7375626432 439957105" "1387683792|544956696" "6974831376 545603884" "0949220671|632555651" "3952970630|379291361" "0456363431|275612955" "2973230054|830527885" "5328382365|989887310" "4034587060 614168216" "4487052014|969272974" "5015479667 744253705" "5756698090|621187161" "9444814561|169429694" "7697999461|477558331" "3822442188 206942845" "2787118311|141642208" "2669534759 308252645" "6121516963|554616321" "5509428225|681372307" "6619817314|310054531" "1759758306 453053985" "9356970729|868811209" "4208830142 806643228" "0898841529|102183632" "9692682718|103744380" "5839709581|790845206" "7264919369|982096148"
2,1,0,1,5,1,2,1,1,1, ,1,0,1,2,1,2,3,0,1:26

"Drunkified" ตัวอย่างของ Brian:

6417443208 | 153287613
8540978161 | 726772300
7294922506 263609552
0341937695 498453099
9417989188 370992778
2952186385 | 750207767
7049868670 756968872
1961508589 | 379453595
0670474005 070712970
4817414691 | 670379248
0297779413 | 980515509
6637598208 090265179
6872950638 767270459
7375626432 439957105
1387683792 | 544,956
697483176 5456034
09492201 | 6325551
395297030 | 3792913
 456363431 | 275,612
  73230054 | 830527885
    8382365 | 989887310
    4587060 614168216
  87052014 | 96927297
 50479667 7442537
57566980 | 621187161
944481456 | 169429694
7697999461 | 477558331
3822442188 206942845
2787118311 | 141642208
2669534759 308252645
6121516963 | 554616321
5509428225 | 681372307
6619817314 | 310054531
1759758306 453053985
9356970729 | 868811209
4208830142 806643228
0898841529 | 102183632
9692682718 | 103744380
5839709581 | 790845206
7264919369 | 982096148
$ java C "6417443208|153287613" "8540978161|726772300" "7294922506 263609552" "0341937695 498453099" "9417989188 370992778" "2952186385|750207767" "7049868670 756968872" "1961508589|379453595" "0670474005 070712970" "4817414691|670379248" "0297779413|980515509" "6637598208 090265179" "6872950638 767270459" "7375626432 439957105" "1387683792|544956" "697483176 5456034" "09492201|6325551" "395297030|3792913" " 456363431|275612" "  73230054|830527885" "    8382365|989887310" "    4587060 614168216" "  87052014|96927297" " 50479667 7442537" "57566980 | 621187161" "944481456 | 169429694" "7697999461|477558331" "3822442188 206942845" "2787118311|141642208" "2669534759 308252645" "6121516963|554616321" "5509428225|681372307" "6619817314|310054531" "1759758306 453053985" "9356970729|868811209" "4208830142 806643228" "0898841529|102183632" "9692682718|103744380" "5839709581|790845206" "7264919369|982096148"
 , , , ,0,5,2,0,1, , , ,1,1,1,3,2:16

โซลูชันที่มองเห็น:

09492201 | 6325551
395297030 | 3792913
\ 456363431 | 275,612
 \ 73230054 | 830527885
  \ 8382365 | 989887310
   \ 4 \ 87060 614168216
  87/5 - \ 4 | 96,927 \ 97
 50479667 \ 74425/7
57566980 | \ 62- / 87161
944481456 | \ / 69429694
7697999461 | 477558331

สนุก!

แก้ไข: ตอนนี้ฉันเพิ่งจะอวด (ถนนสองสายรวม! เขาทำได้ไหม)

948384 | 4288324 324324 | 121323
120390 | 1232133 598732 | 123844
 293009 | 2394023 432099 | 230943
 234882 | 2340909 843893 | 849728
  238984 | 328498984328 | 230949
  509093 | 904389823787 | 439898
   438989 | 3489889344 | 438984
   989789 | 7568945968 | 989455
    568956 | 56985869 | 568956
    988596 | 98569887 | 769865
     769879 | 769078 | 678977
     679856 | 568967 | 658957
      988798 | 8776 | 987979
      987878 | 9899 | 989899
       999889 | | 989899
       989999 | | 989999
        989898 | | 998999
        989999 | | 999999
         989998 || 899999
         989998 || 998999

วิธีการแก้:

$ java C "948384 | 4288324   324324 | 121323" "120390 | 1232133   598732 | 123844" " 293009 | 2394023 432099 | 230943" " 234882 | 2340909 843893 | 849728" "  238984 | 328498984328 | 230949" "  509093 | 904389823787 | 439898" "   438989 | 3489889344 | 438984" "   989789 | 7568945968 | 989455" "    568956 | 56985869 | 568956" "    988596 | 98569887 | 769865" "     769879 | 769078 | 678977" "     679856 | 568967 | 658957" "      988798 | 8776 | 987979" "      987878 | 9899 | 989899" "       999889 |    | 989899" "       989999 |    | 989999" "        989898 |  | 998999" "        989999 |  | 999999" "         989998 || 899999" "         989998 || 998999"
 ,2,0,3,0,0, ,|,|, ,|,|, ,|,|, ,|,|, ,|,|, ,|,|, ,|,|, , , , , , , ,|, ,|, ,|, ,|, ,|, ,|, ,|,|, , ,1,0,7,2:15

(โบนัส: เส้นทางจาก ungolfed):

$ java Chicken < test5.txt
best start: 3 cost: 15
  -> 2 -> 0 -> 3 -> 0 -> 0 ->   -> | -> | ->   -> | -> | ->   -> | -> | ->   -> | -> | ->   -> | -> | ->   -> | -> | ->
  -> | -> | ->   ->   ->   ->   ->   ->   ->   -> | ->   -> | ->   -> | ->   -> | ->   -> | ->   -> | ->   -> | -> | ->
  ->   -> 1 -> 0 -> 7 -> 2 -> 15
/ -> - -> - -> \ -> / -> / -> - -> , -> , -> - -> , -> , -> - -> , -> , -> - -> , -> , -> - -> , -> , -> - -> , -> , ->
- -> , -> , -> / -> \ -> - -> - -> - -> / -> / -> ^ -> / -> ^ -> / -> ^ -> / -> ^ -> / -> ^ -> / -> ^ -> / -> , -> , ->
/ -> - -> \ -> \ -> - -> \ -> across

รายละเอียดเกี่ยวกับอัลกอริทึม

ขอคำอธิบายที่สมบูรณ์มากขึ้นเกี่ยวกับเทคนิคการเขียนโปรแกรมแบบไดนามิกที่ฉันจ้างดังนั้นต่อไปนี้:

ฉันใช้วิธีการแก้ปัญหามาร์คและ precompute มันมีชื่อที่เหมาะสม แต่ฉันลืมไปนานแล้ว บางทีคนอื่นสามารถเสนอมันได้?

ขั้นตอนวิธีการ:

  • เริ่มต้นที่คอลัมน์ขวาสุดและไปทางซ้ายคำนวณต่อไปนี้เกี่ยวกับแต่ละเซลล์ในคอลัมน์:
    • ผลรวมของการเคลื่อนย้ายต้นทุนต่ำสุดซึ่งกำหนดเป็นต้นทุนเซลล์ปัจจุบัน + เซลล์ต้นทุนต่ำสุดที่สามารถเข้าถึงได้ในคอลัมน์ถัดไป
    • การเคลื่อนไหวที่ต้องดำเนินการเพื่อให้ได้ต้นทุนที่ต่ำที่สุดนี้เพียงแค่เคลื่อนย้ายที่ถูกต้องจากเซลล์นี้ไปยังเซลล์เดียวอีกเซลล์หนึ่ง
  • ท่อถูกเลื่อนออกไป ในการแก้ไขไพพ์คุณจะต้องคำนวณคอลัมน์ทั้งหมดดังนั้นเราจะไม่คำนวณไพพ์จนกว่าจะถึงคอลัมน์ถัดไป
    • เมื่อพิจารณาราคาที่ถูกที่สุดของเซลล์ทางด้านซ้ายของท่อเราจะคำนวณทิศทางที่ดีที่สุดในการเดินทางไปตามท่อ - มันจะแก้ปัญหาเสมอไม่ว่าจะขึ้นหรือลงดังนั้นเราคำนวณหนึ่งครั้ง
    • จากนั้นเราจัดเก็บเช่นเดียวกับเซลล์อื่น ๆ ค่าใช้จ่ายที่ดีที่สุด (กำหนดเป็นค่าใช้จ่ายของเซลล์ที่เราไปถึงโดยการเดินทางขึ้นหรือลงบนท่อ) และทิศทางที่จะเดินทางไปถึง

หมายเหตุ:

แค่นั้นแหละ. เราสแกนจากบนลงล่างขวาไปซ้ายหนึ่งครั้ง เซลล์เดียวที่สัมผัส (อาจ) มากกว่าหนึ่งครั้งเป็นท่ออย่างไรก็ตามแต่ละท่อจะ "แก้ไข" เพียงครั้งเดียวทำให้เราอยู่ในหน้าต่าง O (m * n)

เพื่อจัดการกับขนาดของแผนที่ "แปลก" ฉันเลือกที่จะสแกนล่วงหน้าและทำให้ความยาวของแถวปกติเป็นปกติด้วยการเติมด้วยอักขระ null อักขระ Null นับเป็น "ศูนย์ต้นทุน" ย้ายเช่นเดียวกับท่อและช่องว่าง จากนั้นในการพิมพ์วิธีแก้ปัญหาฉันหยุดต้นทุนการพิมพ์หรือเคลื่อนย้ายเมื่อถึงขอบถนนปกติหรือถึงตัวอักษรว่าง

ความสวยงามของอัลกอริทึมนี้ง่ายมากใช้กฎเดียวกันกับทุกเซลล์สร้างโซลูชันเต็มรูปแบบโดยแก้ปัญหาย่อย O (m * n) และในแง่ของความเร็วค่อนข้างเร็ว มันทำการแลกเปลี่ยนหน่วยความจำสร้างสองสำเนาอย่างมีประสิทธิภาพในหน่วยความจำของแผนที่ถนนเป็นครั้งแรกในการจัดเก็บข้อมูล "ค่าใช้จ่ายที่ดีที่สุด" และครั้งที่สองในการจัดเก็บข้อมูล "ย้ายที่ดีที่สุด" ต่อเซลล์; นี่เป็นเรื่องปกติสำหรับการเขียนโปรแกรมแบบไดนามิก


คุณสามารถอธิบายวิธีการของคุณเพื่อเพิ่มเติมอีกเล็กน้อยได้ไหม? ฉันยังพยายามแนวทางการเขียนโปรแกรมแบบไดนามิก (แตกต่างกันบ้าง) แต่ก็พบปัญหาเหล่านั้นอยู่ ฉันยังพิจารณาวิธีการเพิ่ม (แถวต่อแถว) เพื่อจัดการกับถนนที่ยาวมาก ๆ ที่ไม่กว้างเกินไปโดยไม่ใช้หน่วยความจำมากเกินไป คุณรู้หรือไม่ว่ามีวิธีที่จะทำในเวลา O (m ^ 2 * n)?
dfeuer

@ pdfeuer มันคือทั้งหมดที่เกี่ยวกับการแลกเปลี่ยนเพื่อให้แน่ใจ ไม่มีวิธีการแบบแถวต่อแถวที่ฉันคิดว่าสามารถจัดการกับการเรียงสับเปลี่ยนของข้อมูลทั้งหมดโดยไม่จำนนต่อเวลา O (m ^ n) ในบางจุด นี่เป็นปัญหาแบบคอลัมน์ต่อคอลัมน์โดยการสร้าง (การเคลื่อนไหวส่วนใหญ่จะมาจากวิธีแก้ปัญหา DP จากซ้ายไปขวา - ประสิทธิภาพ DP เปลี่ยนจากขวาไปซ้าย) คุณอาจสามารถใช้วิธี O (m * n) ในการแก้ปัญหาแบบทีละแถวโดยใช้การมองที่เรียบง่ายและมองไปข้างหน้า แต่คุณเพิ่มความซับซ้อนมากขึ้นโดยไม่ต้องบันทึกหน่วยความจำจำนวนมาก
ProgrammerDan

สิ่งที่ฉันคิดคือถ้าฉันไม่ผิดคุณจำเป็นต้องติดตามเส้นทางที่ดีที่สุดเท่าที่ผ่านมาและสำหรับแต่ละตารางในแถวที่ประมวลผลล่าสุดเส้นทางที่รู้จักกันดีที่สุดจากขอบด้านซ้ายไปยังขอบด้านขวาและ ถึงแต่ละช่องทางด้านขวาในแถวเดียวกัน มันผิดหรือเปล่า?
dfeuer

1
ขอบคุณ! คุณสามารถร่นรหัสการลดลงของคุณโดยการกำหนดเป็นc -1>>>1
dfeuer

1
ฉันกำลังตั้งเป้าหมาย Haskell ซึ่งจะทำให้ยากต่อการแข่งขัน แต่มันเป็นสิ่งที่ฉันรู้ดีที่สุด
dfeuer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.