转载请注明出处,谢谢

viewmode=contents">http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove

水水更健康,最终回到1800+了。。。

DIV2 1000pt

显然每一列是独立的。分开考虑。

对于某一列。假设按单个字符U , D从下往上考虑的话。发现连续两个U的话。以下的U能够移动的位置受上面一个影响。

只是因此能够想到相邻的U , D互相限制位置,能够依次处理。相邻同样字符的话。 能够作为一个字符。

做法:把相邻的U合并,相邻的D合并。dp[i][j]表示前i个部分处理完。第i个部分最靠上的一个位置为j。

这种话,假设当前为U。那么向上移动的最远位置为下一个部分最靠下的D的位置。

假设当前为D。那么向下移动的最远位置便是上一个部分最靠上的U的位置。

这样就能够搞出每个部分的上下界,然后分别DP。

typedef long long LL;
const LL MOD = 1000000007;
const int N = 55;
LL dp[N][N];
void add (LL &a , LL b) {
a += b;
a = (a % MOD + MOD) % MOD;
}
LL mut (LL a , LL b) {
a = a * b % MOD;
a = (a + MOD) % MOD;
return a;
}
LL gao_up (vector<int>&v , int limit) {
int n = v.size();
LL c[N][N]; memset (c , 0 , sizeof(c));
c[n - 1][limit - 1] = 1;
for (int i = n - 2 ; i >= 0 ; i --) {
for (int j = limit ; j >= 0 ; j --) {
if (c[i + 1][j] == 0) continue;
for (int k = v[i] ; k < j ; k ++) {
add (c[i][k] , c[i + 1][j]);
}
}
}
LL ans = 0;
for (int i = 1 ; i <= limit ; i ++) {
add (ans , c[0][i]);
}
return ans;
}
LL gao_down (vector<int>&v , int down , int up) {
int n = v.size();
LL c[N][N]; memset (c , 0 , sizeof(c));
c[0][down] = 1;
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j <= up ; j ++) {
if (c[i][j] == 0) continue;
for (int k = j + 1 ; k <= v[i] ; k ++)
add (c[i + 1][k] , c[i][j]);
}
}
return c[n][up];
}
vector<vector<int> > v;
class FoxAndShogi {
public:
int differentOutcomes(vector <string> board) {
int row = board.size() , col = board[0].size();
LL ans = 1LL;
for (int c = 0 ; c < col ; c ++) {
memset (dp , 0 , sizeof(dp));
string s = "";
v.clear ();
for (int r = row - 1 ; r >= 0 ; r --)
s = s + board[r][c];
int first = -1;
for (int i = 0 , pre = -1 ; i < s.size() ; i ++) {
if (s[i] == '.') continue;
if (s[i] == 'D' && pre == 0) {
v[v.size() - 1].push_back (i + 1);
}
else if (s[i] == 'U' && pre == 1) {
v[v.size() - 1].push_back (i + 1);
}
else {
if (first == -1) {
if (s[i] == 'U') first = 0;
else first = 1;
}
vector<int>t;
t.push_back(i + 1);
v.push_back(t);
if ( s[i] == 'U') pre = 1;
else pre = 0;
}
}
dp[0][0] = 1;
for (int i = 0 ; i < v.size() ; i ++) {
for (int j = 0 ; j <= row ; j ++) {
if (dp[i][j] == 0) continue;
// up
if ((first == 0 && i % 2 == 0) || (first == 1 && i % 2 == 1)){
int now = v[i][v[i].size() - 1];
int limit = (i + 1) < v.size() ? v[i + 1][0] : (col + 1);
for (int k = now ; k < limit ; k ++) {
add (dp[i + 1][k] , mut (dp[i][j] , gao_up (v[i] , k + 1)));
}
}
//down
else {
int now = v[i][v[i].size() - 1];
for (int k = j + 1 ; k <= now ; k ++) {
add (dp[i + 1][k] , mut (dp[i][j] , gao_down (v[i] , j , k)));
}
}
}
}
LL tmp = 0;
for (int i = 0 ; i <= row ; i ++)
add (tmp , dp[v.size()][i]);
// cout << tmp << endl;
ans = mut (ans , tmp);
}
return ans;
}
};

DIV1 250PT

把L,R所有提取出来,先推断下是否一致。

然后 比較下位置

DIV1 500 PT

异或结果 小于等于LIMIT,先处理相等的情况,既异或结果每一位都和LIMIT相等,列方程组,求一下秩。

否则的话。必定存在某一位,LIMIT中为1。实际为0,并且高位和LIMIT一致,低位随意 。

所以枚举相隔的这个位置。相同是列方程组求解。

typedef long long LL;
int a[100][100];
int n , m ;
long long gauss(){ int i,j,row=1,col;
for (col=1;col<=m;++col){
for (i=row;i<=n;++i)
if (a[i][col])
break ;
if (i>n)
continue ;
if (i!=row){
for (j=col;j<=m;++j)
swap(a[row][j],a[i][j]);
swap(a[i][m + 1],a[row][m + 1]);
}
for (i=row+1;i<=n;++i)
if (a[i][col]){
for (j=col;j<=m;++j)
a[i][j]^=a[row][j];
a[i][m + 1]^=a[row][m + 1];
}
++row;
}
for (i=row;i<=n;++i)
if (a[i][m + 1])
return 0;
return 1ll<<(long long)(m-row+1);
}
class XorCards {
public:
long long numberOfWays(vector<long long> number, long long limit) {
LL ans = 0;
m = number.size();n = 61;
memset (a , 0 , sizeof(a));
for (int i = 0 ; i < 61 ; i ++) {
for (int j = 0 ; j < m ; j ++) {
if (number[j] & (1LL << i)) a[i + 1][j + 1] = 1;
}
a[i + 1][m + 1] = (limit & (1LL << i)) ? 1 : 0;
}
ans = gauss ();
for (int i = 0 ; i < 61 ; i ++) {
if (!(limit & (1LL << i))) continue;
memset (a , 0 , sizeof(a));
for (int j = i + 1 ; j < 61 ; j ++) {
for (int k = 0 ; k < m ; k ++) {
if (number[k] & (1LL << j)) a[j + 1][k + 1] = 1;
}
a[j + 1][m + 1] = (limit & (1LL << j)) ? 1 : 0;
}
for (int k = 0 ; k < m ; k ++) {
if (number[k] & (1LL << i)) a[i + 1][k + 1] = 1;
}
ans += gauss ();
}
return ans;
}
};

DIV1 1000PT

排序方式价格优势,然后 镶上每次迭代暴力,folyd寻求最短的价格后,值。。

SRM 590 DIV1的更多相关文章

  1. topcoder srm 590 div1 (max_flow_template)

    problem1 link 对于每一个,找到其在目标串中的位置,判断能不能移动即可. problem2 link 如果最后的$limit$为$11=(1011)_{2}$,那么可以分别计算值为$(10 ...

  2. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  3. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  4. 图论 SRM 674 Div1 VampireTree 250

    Problem Statement      You are a genealogist specializing in family trees of vampires. Vampire famil ...

  5. SRM 583 DIV1

    A 裸最短路. class TravelOnMars { public: int minTimes(vector <int>, int, int); }; vector<int> ...

  6. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  7. 状态压缩DP SRM 667 Div1 OrderOfOperations 250

    Problem Statement      Cat Noku has just finished writing his first computer program. Noku's compute ...

  8. 数学 SRM 690 Div1 WolfCardGame 300

    Problem Statement      Wolf Sothe and Cat Snuke are playing a card game. The game is played with exa ...

  9. SRM 618 DIV1 500

    非常棒的组合问题,看了好一会,无想法.... 有很多做法,我发现不考虑顺序的最好理解,也最好写. 结果一定是两种形式 A....A   dp[n-1] A...A...A sgma(dp[j]*dp[ ...

随机推荐

  1. SE 2014年4月17日

    描述BGP路由属性 MED.首选值 的特点 MED相当于IGP协议中的度量值,在其他条件相同时,当本自治系统有多条到达外部自治系统的链路时,MED值小的路由优选.MED属性只能在两个自治系统间传递. ...

  2. C#文件操作基础之File类和FileInfo类

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...

  3. SVNKIT一段代码的分析

    打印SVNkit版本库中的结构: 函数如下: 调用方法如下: listEntries(repository, ""); System.out.println("XXXXX ...

  4. linux下安装cmake和mysql遇到的问题总结

    首先是在安装cmake的过程中遇到的问题: 1.開始使用yum命令安装时,不知道为什么一直不行,然后就准备wget 来先下载压缩包,再手动编译. 因为网络限制,wget不能下载外网的东西一直显示con ...

  5. Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理

    原文链接: Spring Security with Maven原文日期: 2013年04月24日翻译日期: 2014年06月29日翻译人员: 铁锚 1. 概述 本文通过实例为您介绍怎样使用 Mave ...

  6. ACdream原创群赛(18)のAK's dream题解

    只做了4题水题ADGI A题需要注意的就是“[...]”的输出了,何时输出,何时不输出. #include <stdio.h> int main() { int n, cur, d; ; ...

  7. Cocos2d-x 3.2 Lua演示样例 ClickAndMoveTest(点击移动測试)

    Cocos2d-x 3.2 Lua演示样例 ClickAndMoveTest(点击移动測试)  本篇博客介绍Cocos2d-x 3.2Lua演示样例中点击移动的样例,在这个样例你能够得到怎样创建单点触 ...

  8. [Django](1093, &quot;You can&#39;t specify target table &#39;fee_details_invoices&#39; for update in FROM clause&quot;) 错误

    dele_id = Fee_details_invoices.objects.filter(fee_detail_id__in=fee_id_list, return_type='2').values ...

  9. Ibatis之3个不经常使用的Query方法

    1.queryForObject /** * Executes a mapped SQL SELECT statement that returns data to populate * the su ...

  10. [模式识别].(希腊)西奥多里蒂斯&lt;第四版&gt;笔记8它__模板匹配

      在语音识别方面,同样的话都是同一个人,每次说的情况是不同的,难以识别.本章是定义如何适应不同的情况有不同的特性指标. 1,基于最优路径搜索的度量:①贝尔曼最优性原则和动态编程②编辑距离(The E ...