Fzu 2200 cleaning【环状Dp-----暴力枚举拆环】
来源:互联网 发布:mysql区分大小写查询 编辑:程序博客网 时间:2024/06/06 06:24
Problem 2200 cleaning
Accept: 103 Submit: 196
Time Limit: 1000 mSec Memory Limit : 65536 KB
Problem Description
N个人围成一圈在讨论大扫除的事情,需要选出K个人。但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距离不能为2,他们想知道共有多少种方法。
Input
第一行包含一个数T(T<=100),表示测试数据的个数。
接下来每行有两个数N,K,N表示人数,K表示需要的人数(1<=N<=1000,1<=K<=N)。
Output
输出满足题意的方案数,方案数很大,所以请输出方案数mod 1,000,000,007 后的结果。
Sample Input
2
4 2
8 3
Sample Output
4
16
Source
FOJ有奖月赛-2015年10月思路:
如果其是一个线状的选取的话,那么因为每次选取的时候只涉及到最后两个人的状态,所以我们不妨设定dp【i】【j】【2(a)】【2(b)】表示到第i个人,已经选取了j个人并且最后两个人的状态分别为a和b的方案数。
那么不难推出其状态转移方程:
那么对于一个询问来讲,我们先枚举开头两个位子的状态即可,根据开头两个位子的状态我们可以确定最后两个位子的可行状态,对应维护这个解即可。
但是每个询问要O(4*n^2*4)的时间复杂度,t==100.我们直接这样跑是被卡了TLE的。
那么我们预处理出来搞这个问题就行了。
Ac代码:
#include<stdio.h>#include<string.h>using namespace std;int mod=1e9+7;int n,k;int ans[1005][1005];int dp[1005][1005][2][2];void Dp_Slove(int s,int ss){ memset(dp,0,sizeof(dp)); dp[2][s+ss][s][ss]=1; for(int i=3;i<=1000;i++) { for(int j=0;j<=i;j++) { dp[i][j][0][0]+=dp[i-1][j][1][0]; dp[i][j][0][0]%=mod; dp[i][j][0][0]+=dp[i-1][j][0][0]; dp[i][j][0][0]%=mod; dp[i][j][0][1]+=dp[i-1][j-1][0][0]; dp[i][j][0][1]%=mod; dp[i][j][1][0]+=dp[i-1][j][0][1]; dp[i][j][1][0]%=mod; dp[i][j][1][0]+=dp[i-1][j][1][1]; dp[i][j][1][0]%=mod; dp[i][j][1][1]+=dp[i-1][j-1][0][1]; dp[i][j][1][1]%=mod; } } for(int a=0;a<=1;a++) { for(int b=0;b<=1;b++) { if(s==1&&a==1)continue; if(ss==1&&b==1)continue; for(int i=2;i<=1000;i++) { for(int j=1;j<=1000;j++) { ans[i][j]+=dp[i][j][a][b]; ans[i][j]%=mod; } } } }}int main(){ memset(ans,0,sizeof(ans)); for(int i=0;i<=1;i++) { for(int j=0;j<=1;j++) { Dp_Slove(i,j); } } int t; scanf("%d",&t); while(t--) { int n,k; scanf("%d%d",&n,&k); printf("%d\n",ans[n][k]); }}
阅读全文
0 0
- Fzu 2200 cleaning【环状Dp-----暴力枚举拆环】
- FZU 2200 cleaning dp+预处理
- FZU 2200 cleaning (环形dp)
- FZU 2200 cleaning (环dp的处理)
- FZU 2041 暴力枚举
- Fzu 2204 7【环形Dp----暴力拆分环】
- foj2200 Problem 2200 cleaning dp
- FOJ 2200 cleaning(环形dp)
- 区间Dp 暴力枚举+动态规划 Hdu1081
- Triangular Pastures-DP(有点像是暴力枚举)
- poj 3036 Honeycomb Walk 暴力枚举 dp
- 【FZU】Problem 2217 Taxi 【暴力状压dp】
- POJ 2228 Naptime 环状DP
- fzu 2064(暴力)
- fzu 2056 暴力
- 暴力枚举
- 暴力枚举?
- 暴力枚举
- angular2封装组件(一)——引用js包
- javascript中json、回调函数、匿名函数的一些测试
- 面向对象的六大原则解析
- cout.precision()的使用
- leetcode 357. Count Numbers with Unique Digits
- Fzu 2200 cleaning【环状Dp-----暴力枚举拆环】
- 最小二乘法
- 响铃:内容越发重要的时代,开放共享要成为智能电视的新玩法?
- echarts bar内tooltip的formatter回调参数params.seriesId中的’\0’问题以及stack的获取
- hdu1159 最长公共子序列 LCS
- 类型“Microsoft.VisualStudio.Tools.Office.Ribbon.View.GenericRibbonView”没有名为“Factory”的属性。
- svn 文件状态标记的含义
- 一个Native Service的完整示例
- [bzoj2152]聪聪可可 点分