การเชื่อมต่อที่มีประสิทธิภาพ


17

บทนำ

มีสวนที่กำหนดโดยคณะกรรมการสี่เหลี่ยมจัตุรัสขนาดใหญ่เช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่

ตัวเลขภายในสี่เหลี่ยมจัตุรัสเล็ก ๆ แต่ละอันแทนค่า / เงินสด / พื้นที่ของ ...

ชาวนาต้องการความช่วยเหลือในการหาสี่เหลี่ยมNที่เชื่อมโยงกัน(นั่นหมายถึงสี่เหลี่ยม N ทั้งหมดควรมีเส้นขอบที่ใช้ร่วมกันอย่างน้อยหนึ่งเส้น)ให้คุณค่าที่ยิ่งใหญ่ที่สุดแก่เขา

ตัวอย่างเช่น:

หากแล้วออกจะต้องN=1140

ถ้าเป็นN=6เช่นนั้น ..

ป้อนคำอธิบายรูปภาพที่นี่

เอาท์พุท ..the 315ต้อง

ท้าทาย

โปรแกรมของคุณ / ฟังก์ชั่นจะต้องใช้เวลาที่ค่าเมทริกซ์ของและจำนวนNเป็น input / ข้อโต้แย้งและการส่งออกจะต้องเชื่อมต่อที่มีประสิทธิภาพ 's คุ้มค่า

ตั้งแต่นี้เป็นคำตอบสั้นที่สุดในไบต์ชนะ!

ตัวอย่าง

การป้อนข้อมูล:

10 -7 11 7 3 31
33 31 2 5 121 15
22 -8 12 10 -19 43
12 -4 54 77 -7 -21
2 8 6 -70 109 1
140 3 -98 6 13 20
6

เอาท์พุท: 315


การป้อนข้อมูล:

35 -7
-8 36
2

เอาท์พุท: 29


2
ขั้นตอนวิธีกำลังดุร้ายบางอย่างอาจช้ามาก มีข้อ จำกัด ตรงเวลาสำหรับกรณีเช่นกรณีทดสอบครั้งแรกหรือไม่?
เลเวลริเวอร์เซนต์

@steveverrill สำหรับความท้าทายนี้จะไม่มีการนับเวลาที่ซับซ้อน แต่ถ้าคุณตอบคำถามนี้และพิสูจน์ว่าวิธีการของคุณดีกว่าการใช้กำลังอย่างดุเดือดฉันจะยินดีตอบคำตอบของคุณ
ลบออก

คำตอบ:


4

JavaScript (ES6), 190 ไบต์

(m,n)=>m.map((a,r)=>a.map((_,c)=>f(r,c,[0],0)),o=f=(x,y,s,t)=>s[n]?o>t?0:o=t:s.indexOf(w=x+","+y)<0&&m[y]&&(v=m[y][x])<1/0&&f(x+1,y,s=[...s,w],t+=v)+f(x,y+1,s,t)+f(x-1,y,s,t)+f(x,y-1,s,t))|o

คำอธิบาย

รับเมทริกซ์เป็นอาร์เรย์ของอาร์เรย์

เริ่มจากแต่ละช่องแล้วใช้ฟังก์ชั่นวนซ้ำเพื่อทดสอบชุดค่าผสมที่เป็นไปได้ทั้งหมด นี่เป็นวิธีการที่โหดเหี้ยม แต่มันก็เสร็จสิ้นเกือบจะทันทีสำหรับเคสทดสอบเครื่องแรกของฉัน

(m,n)=>
  m.map((a,r)=>                 // for each row
    a.map((_,c)=>               // for each column
      f(r,c,[0],0)              // start checking paths from the coordinate of the square
    ),
    o=                          // o = output number (max total)
    f=(x,y,s,t)=>               // recursive function f, x & y = current square, t = total
                                // s = array of used squares (starts as [0] so length = +1)
      s[n]?                     // if we have used n squares
        o>t?0:o=t               // set o to max of o and t
      :s.indexOf(w=x+","+y)<0&& // if the square has not been used yet
      m[y]&&(v=m[y][x])<1/0&&   // and the square is not out of bounds
                                // ( if value of square is less than Infinity )

        // Check each adjacent square
        f(x+1,y,
          s=[...s,w],           // clone and add this square to s
          t+=v                  // add the value of this square to the total
        )
        +f(x,y+1,s,t)
        +f(x-1,y,s,t)
        +f(x,y-1,s,t)
  )
  |o                            // return output

ทดสอบ

var solution = (m,n)=>m.map((a,r)=>a.map((_,c)=>f(r,c,[0],0)),o=f=(x,y,s,t)=>s[n]?o>t?0:o=t:s.indexOf(w=x+","+y)<0&&m[y]&&(v=m[y][x])<1/0&&f(x+1,y,s=[...s,w],t+=v)+f(x,y+1,s,t)+f(x-1,y,s,t)+f(x,y-1,s,t))|o
<textarea rows="7" cols="40" id="Matrix">10 -7 11 7 3 31
33 31 2 5 121 15
22 -8 12 10 -19 43
12 -4 54 77 -7 -21
2 8 6 -70 109 1
140 3 -98 6 13 20</textarea><br />
N = <input type="number" id="N" value="6" /><br />
<button onclick="result.textContent=solution(Matrix.value.split('\n').map(x=>x.split(' ').map(z=>+z)),N.value)">Go</button>
<pre id="result"></pre>

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