转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove
第一次做TC,这么欢乐,第一次在DVI 2把3题都过了。
250PT:由于总高度最多才47*(47+47)。而且也只有两种颜色
枚举最下面的颜色,然后枚举,记录一下不同的高度即可。
500PT:div2的这题很简单,只有7个数,枚举所有排列,然后判断一下就行了,next_permutation一下就可以了。
div1也有类似的题目,有47个数,这样就不能枚举了,不过可以发现高度肯定是递减然后递增,不然如果有一个塔的高度比两侧的大,那么这个塔的高度就要记录两次,肯定不是最优的。
接下来还要按字典序,必然第一个是0,然后找出一个字典序最小的递减的,将剩下的数递增就可以了。
class TheBrickTowerMediumDivOne{ public: vector <int> find(vector <int> heights){ vector<int>ans; int n=heights.size(); bool flag[50]={0}; ans.push_back(0); while(1){ int i=1; for(;i<n;i++) if(!flag[i]&&heights[i]<=heights[ans.back()]) break; if(i==n) break; ans.push_back(i); flag[i]=true; } while(1){ int idx=-1; for(int i=1;i<n;i++) if(!flag[i]&&(idx==-1||heights[i]<heights[idx])) idx=i; if(idx==-1) break; ans.push_back(idx); flag[idx]=true; } return ans; } };
很容易想到一个H*K*C^8的DP,勉强还是可以接受的。
dp[i][j][a][b][c][d],表示第i层,总共有j组相同颜色,第i层的4个颜色分别为a,b,c,d时的种数。
10层循环,不过当时怕TLE,我还是WS的把当颜色为4的部分打了表。
也可以状态压缩下,变成3维的。