LampsGrid
枚举(思维难度大)
每次操作改变一整列的状态,所以如果初始时某两行状态相同,那么经过任意次操作后这两行的状态仍然相同;如果初始时某两行状态不相同,那么经过任意次操作后这两行的状态仍然不相同。枚举每一行,考虑能否把它通过K次操作变为全亮,如果能的话再数一数有多少行和这一行初始状态相同,它们也能通过同样的K次操作变为全亮。找出能变为全亮的且与之状态相同的行数最多的行即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <cmath> #include <ctime> #include <iostream> #include <sstream> #include <map> #include <algorithm> #include <string> #include <vector> using namespace std; class LampsGrid { public: int mostLit(vector <string> initial, int K) { int ans=0; for(int i=0;i<initial.size();++i) { int num=0; for(int j=0;j<initial[i].size();++j) num+=initial[i][j]=='0'; if(num>K||(K-num)%2) continue; num=0; for(int j=0;j<initial.size();++j) num+=initial[i]==initial[j]; ans=max(ans,num); } return ans; } }; |
表示,其中
且0<=j<=k。对于原图中的无向边
,在新图中加入
与
之间的无向边
,加入
之间的权为0的无向边
。除此之外,对于所有的
加入
之间权为0的无向边。显然新图中点
到
的最短路径就是所求答案。我们可以使用Dijkstra和堆来快速求最短路径。