using System; using System.Collections.Generic; using System.Text; using System.Linq; class Program { public void Proc() { Reader.IsDebug = false; int[] inpt = Reader.ReadLine().Split(' ').Select(a => int.Parse(a)).ToArray(); long[,] Map = new long[inpt[0]+1, inpt[1]+1]; this.FriendsList = new Friends[inpt[2]]; int japariman = inpt[3]; for (int i = 0; i < this.FriendsList.Length; i++) { this.FriendsList[i] = new Friends(i, Reader.ReadLine()); } if (!this.FriendsList.Any(a => a.X == 0 && a.Y == 0)) { Map[0, 0] = 1; } for (int i = 1; i <= inpt[0]; i++) { if(!FriendsList.Any(a=>a.X == i && a.Y == 0)) { Map[i, 0] = Map[i - 1, 0]; } } for (int i = 1; i <= inpt[1]; i++) { if(!FriendsList.Any(a=>a.X == 0 && a.Y == i)) { Map[0, i] = Map[0, i - 1]; } } for(int i=1; i<=inpt[0]; i++) { for(int j=1; j<=inpt[1]; j++) { if(!FriendsList.Any(a=>a.X == i && a.Y == j)) { Map[i, j] = Map[i-1, j] + Map[i,j-1]; } } } Ans ans = GetAns(Map, 0, japariman); Console.WriteLine(ans.WayCount); for (int i = 0; i < FriendsList.Length; i++) { int key = 1 << i; if ((ans.Flag & key) != 0) { Console.WriteLine(FriendsList[i].Name); } } } private Ans GetAns(long[,] map, int flag, int remain) { if (remain <= 0) { return new Ans(map[map.GetLength(0)-1, map.GetLength(1)-1], flag); } int w = map.GetLength(0); int h = map.GetLength(1); List target = new List(); if (map[0, 0] == 0) { target.Add(FriendsList.Where(a => a.X == 0 && a.Y == 0).First()); } else { long max = FriendsList.Where(a => map[a.X, a.Y] == 0).Select(a =>a.GetKaitu(map)).Max(); target = FriendsList.Where(a => a.GetKaitu(map) == max).ToList(); } Ans ans = new Ans(0, 0); foreach (Friends f in target) { long[,] subMap = GetMap(map, f.X, f.Y, f.GetKaitu(map)); Ans ret = this.GetAns(subMap, flag + (1 << f.ID), remain - 1); if (ret.WayCount > ans.WayCount) { ans = ret; } } return ans; } private long[,] GetMap(long[,] basMap, int x, int y, long val) { int w = basMap.GetLength(0); int h = basMap.GetLength(1); long[,] newMap = new long[w, h]; for(int i=0; i