转载请注明出处,谢谢

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月4日

    如图OSPF自治系统中有4个区域,要求如图配置使得中所有网络均能够相互访问为了网络安全及优化网络性能: 使用ospf实现全网互通: [RT1]ospf 1 router-id 1.1.1.1 [RT1 ...

  2. Django写的投票系统3(转)

    Django的管理面板默认是不开启的,所以我们需要进行一些设置工作1.在INSTALLED_APPS里面把 django.contrib.admin 前面的注释去掉2.运行 python manage ...

  3. 用XAML做网页!!—框架

    原文:用XAML做网页!!-框架 上一篇中我进行了一下效果展示和概述,此篇开始将重现我此次尝试的步骤,我想大家通过阅读这些步骤,可以了解到XAML网页排版的方法. 下面就开始编写XAML,首先来定义一 ...

  4. C的xml编程文章链接

    官方地址:http://www.xmlsoft.org/ http://hi.baidu.com/singyea/item/ed4d1c335a9527b8633aff82 http://os.chi ...

  5. Golang初学者的资源整理

    看了汪汪汪不是我的语言的GO语言零基础入门资料整理,个人感觉还不够全面,忍不住过来补充一些内容. 网站教程: GO语言编程 and GO语言开发2048 from 实验楼Go语言后台应用开发 form ...

  6. SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

    原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...

  7. ecshop 调用其他数据库中的商品

    ecshop中修改includes/cls_ecshop.php中第53行 function table($str) { /* if($str=='goods'){ return '`ecshop3' ...

  8. HDU1071 The area 【积分】

    The area Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. substance的使用示例(转)

    可以使用substance改变界面的皮肤和主题,让Java制作的界面“炫”起来 . 可以下载substance.jar文件 在代码中你可以用: static { try { try { UIManag ...

  10. 在Eclipse在使用JUnit4单元测试(0基础知识)

    自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数.这些函数的功能可能非常强大,但我们在 ...