topcoder srm 556 div1 [pratice]

topcoder srm 556 div1 [pratice]
今天好不容易在gentoo下配置好了java和javaws...(用的itedtea) 终于可以做tc了,之前由于做系统+讲课好久没有更新blog了,最近也没有好好刷题,罪过...

250pt

一个点数为50的无向图,每个节点i有一个分值v[i],当你进入到v[i]的时候,你的分数是value(当前分数) XOR v[i],请问从点0开始,你任意走能获得的最大分数。

算法分析:
   二维状态,广搜即可...

srm 556div1 250pt
 1 #include<queue>
 2 #include<vector>
 3 #include<string>
 4 #include<iostream>
 5 using namespace std;
 6 const int M = 1200;
 7 bool dp[55][M];
 8 class XorTravelingSalesman{
 9 public:
10 int maxProfit(vector<int>val,vector<string>G){
11     int n = G.size();
12     queue<pair<int,int> >Q;
13     dp[0][val[0]] = 1;
14     Q.push(make_pair(0,val[0]));
15     while(!Q.empty()){
16         int u=Q.front().first;
17         int p=Q.front().second,q;
18         Q.pop();
19         for(int v=0;v<n;v++if(G[u][v]=='Y'&&!dp[v][q=p^val[v]]){
20             dp[v][q]=1;
21             Q.push(make_pair(v,q));
22         }
23     }
24     for(int i = M-1; i>=0; i--for(int j = 0; j < n; j++if(dp[j][i]) return i;
25 }};

500pt

你手头上有一个数A,通过这个数A你要构造一个大于B的数C,规则如下。
      每次你讲数A的最左端的数拿走,放到C的最左端或者最右端。
求你能构造出的最小的C。

算法分析:
   动态规划,dp[i][l][r]表示A的前i个数去构造比B[l]...B[r]大的数的最小的数。因为前i个数构造的总是B的连续一段...
   所以第i个数要么放在l位置,要么放在r位置喽~

srm 556div1 500pt
 1 #include<string>
 2 #include<iostream>
 3 using namespace std;
 4 string dp[55][55][55][2],a,b,as[55];
 5 string dfs(int n){
 6     if(as[n]!="!!")return as[n];
 7     if(n==0return as[n]=a[0];
 8     string ta, tb;
 9     ta=tb=a[n];
10     ta = dfs(n-1)+ta;
11     tb = tb+dfs(n-1);
12     return as[n]=min(ta,tb);
13 }
14 string work(int n,int l,int r,int c){
15     char x = a[n];
16     string &ans = dp[n][l][r][c];
17     if(ans != "!!"return ans;
18     if(n==0){if(c&&a[n]>b[l]) return ans = x; if(!c&&x>=b[l]) return ans = x; return ans =""; }
19     string ta,tb;tb=x;
20     int t = c;
21     if(x<b[r]) t = 1else if(x > b[r]) t =0;
22     ta = work(n-1,l,r-1,t);
23     ta.push_back(x);
24     if(x == b[l])
25         tb = tb + work(n-1,l+1,r,c);
26     else if(x > b[l])
27         tb = tb + dfs(n-1);
28     if(ta .size()==1) ta="";
29     if(tb .size()==1) tb="";
30 
31     //    cout<<n<<" "<<l<<" "<<r<<" ta: "<<ta<<" tb: "<<tb<<endl;
32     if(ta==""return ans=tb; if(tb=="")return ans=ta;
33     return ans = min(ta,tb);
34 }
35 class LeftRightDigitsGame2{
36 public:
37     string minNumber(string digits, string lowerBound){
38         a = digits; b = lowerBound;int N=55;
39         for(int i =0;i<N;i++)for(int j=0;j<N;j++for(int k=0;k<N;k++) dp[i][j][k][0]=dp[i][j][k][1]="!!";
40         for(int i=0;i<N;i++as[i]="!!";
41         return work(a.size()-1,0,a.size()-1,0);
42     }
43 };

你可能感兴趣的:(topcoder srm 556 div1 [pratice])