比赛 “Asm.Def战记之拉格朗日点”杯 评测结果 EEEEEEEEEE
题目名称 Asm.Def的打击序列 最终得分 0
用户昵称 Derrick_M 运行时间 0.002 s
代码语言 Pascal 内存使用 64.29 MiB
提交时间 2015-11-04 11:45:06
显示代码纯文本
  1. program P2091;
  2. var
  3. dist:array[1..15,1..15] of longint;
  4. mi:array[1..20] of longint;
  5. dp:array[0..15,0..1024,0..1024] of longint;
  6. ans,n,m,i,s,t,v,max0,c:longint;
  7.  
  8. procedure init;
  9. var
  10. i:longint;
  11. begin
  12. mi[1]:=1;
  13. for i:=2 to 20 do
  14. mi[i]:=mi[i-1] shl 1;
  15. end;
  16.  
  17. function min(u,v:longint):longint;
  18. begin
  19. if u<v then exit(u)
  20. else exit(v);
  21. end;
  22.  
  23. procedure solve;
  24. var
  25. i,j,k,u,cnt,l1,l2,l:longint;
  26. begin
  27. fillchar(dp,sizeof(dp),$6F);
  28. dp[0,0,0]:=0;
  29. for i:=0 to n-1 do
  30. for j:=0 to mi[i+1]-1 do
  31. for k:=0 to mi[i+1]-1 do
  32. begin
  33. if dp[i,j,k]=max0 then continue;
  34. dp[i+1,j+mi[i+1],k+mi[i+1]]:=min(dp[i+1,j+mi[i+1],k+mi[i+1]],dp[i,j,k]+c);
  35. for l:=1 to i do
  36. if ((j shr (l-1)) and 1=1) and (dist[l,i+1]<>max0) then
  37. dp[i+1,j-mi[l]+mi[i+1],k]:=min(dp[i+1,j-mi[l]+mi[i+1],k],dp[i,j,k]+dist[l,i+1]);
  38. for l:=1 to i do
  39. if ((k shr (l-1)) and 1=1) and (dist[i+1,l]<>max0) then
  40. dp[i+1,j,k-mi[l]+mi[i+1]]:=min(dp[i+1,j,k-mi[l]+mi[i+1]],dp[i,j,k]+dist[i+1,l]);
  41. for l1:=1 to i do
  42. begin
  43. if (j shr (l1-1)) and 1=0 then continue;
  44. for l2:=1 to i do
  45. begin
  46. if l1=l2 then continue;
  47. if (k shr (l2-1)) and 1=0 then continue;
  48. if dist[l1,i+1]=max0 then continue;
  49. if dist[i+1,l2]=max0 then continue;
  50. dp[i+1,j-mi[l1],k-mi[l2]]:=min(dp[i+1,j-mi[l1],k-mi[l2]],dp[i,j,k]+dist[l1,i+1]+dist[i+1,l2]-c);
  51. end;
  52. end;
  53. end;
  54. ans:=maxlongint;
  55. for j:=0 to mi[n+1]-1 do
  56. for k:=0 to mi[n+1]-1 do
  57. if ans>dp[n,j,k] then ans:=dp[n,j,k];
  58. writeln(ans);
  59. end;
  60.  
  61. begin
  62. assign(input,'asm_lis.in.in');assign(output,'asm_lis.in.out');
  63. reset(input);rewrite(output);
  64. readln(n,m,c);
  65. fillchar(dist,sizeof(dist),$6F);
  66. fillchar(max0,sizeof(max0),$6F);
  67. init;
  68. for i:=1 to m do
  69. begin
  70. readln(s,t,v);
  71. if v<dist[s,t] then dist[s,t]:=v;
  72. end;
  73. solve;
  74. close(input);close(output);
  75. end.