第九题 迷宫取宝
标题:地宫取宝 X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。 请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。 【数据格式】 输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12) 接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值 要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。 例如,输入: 2 2 2 1 2 2 1 程序应该输出: 2 再例如,输入: 2 3 2 1 2 3 2 1 5 程序应该输出: 14 资源约定: 峰值内存消耗 < 256M CPU消耗 < 1000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。 提交时,注意选择所期望的编译器类型。
反正 看不懂了。
1 4 3
2 5 4 3
答案明显的是 3。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
那么明显的可以拿 2 5 4,2 5 3,2 4 3。 可是……网上找了一个AC的一测试,居然是0。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<bitset> #include<vector> #include<cmath> #define INF 0x7fffffff #define eps 1e-8 #define LL long long #define PI 3.141592654 #define CLR(a,b) memset(a,b,sizeof(a)) #define FOR(i,a,b) for(int i=a;i<b;i++) #define FOR_(i,a,b) for(int i=a;i>=b;i--) #define sf scanf #define pf printf #define all(v) (v).begin(),(v).end() #define acfun std::ios::sync_with_stdio(false) #define SIZE (100000 +1) #define MOD 1000000007 using namespace std; int dp[51][51][14][13]; int g[51][51]; int n,m,kk; int xx[]={1,0}; int yy[]={0,1}; int dfs(int x,int y,int _min,int k) { if(dp[x][y][_min+1][k]>=0)return dp[x][y][_min+1][k]; int sum=0; if(x==n-1&&y==m-1) { if(g[x][y]>_min) { if(k==kk||k==kk-1) sum++; } else if(k==kk) sum++; return dp[x][y][_min+1][k]=sum; } if(x==n||y==m)return 0; if(g[x][y]>_min) { FOR(l,0,2) { sum+=dfs(x+xx[l],y+yy[l],_min,k); sum%=MOD; //走过某个格子时,如果那个格子中的宝贝价值比 //小明手中任意宝贝价值都大,小明就可以拿起它 //求出 tmp 为最小的居然WA了。 // int tmp=_min; // if(_min==-1)tmp=g[x][y]; // sum+=dfs(x+xx[l],y+yy[l],tmp,k+1); /* 比如 1 4 3 2 5 4 3 答案明显的是 2 5 4 2 5 3 2 4 3 一共三种。 不过AC的程序居然答案是 0 */ /*//*/ sum+=dfs(x+xx[l],y+yy[l],g[x][y],k+1); sum%=MOD; } } else { FOR(l,0,2) { sum+=dfs(x+xx[l],y+yy[l],_min,k); sum%=MOD; } } return dp[x][y][_min+1][k]=sum; } int main() { while(~sf("%d%d%d",&n,&m,&kk)) { FOR(i,0,n) FOR(j,0,m) sf("%d",&g[i][j]); CLR(dp,-1); int ans=dfs(0,0,-1,0); pf("%d\n",ans); } }
第十题就更有意思了。坑死为止。
就是找逆序对。
左边 比它 大的。右边比它小的。
long long ans 用 lld 输出WA到哭。改为I64d 就AC。。。累觉不爱。真是坑桥杯。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<bitset> #include<vector> #include<cmath> #define INF 0x7fffffff #define eps 1e-8 #define LL long long #define PI 3.141592654 #define CLR(a,b) memset(a,b,sizeof(a)) #define FOR(i,a,b) for(int i=a;i<b;i++) #define FOR_(i,a,b) for(int i=a;i>=b;i--) #define sf scanf #define pf printf #define all(v) (v).begin(),(v).end() #define acfun std::ios::sync_with_stdio(false) #define SIZE (100000 +1) #define MOD 1000000007 using namespace std; int t[SIZE*3]; int us; void update(int l,int r,int o) { if(l==r) t[o]=1; else { int m=(l+r)>>1; if(us<=m)update(l,m,o*2); else update(m+1,r,o*2+1); t[o]=t[o*2]+t[o*2+1]; } } int ql,qr; int query(int l,int r,int o) { if(ql<=l&&qr>=r) return t[o]; else { int m=(l+r)>>1; int ans=0; if(ql<=m)ans+=query(l,m,o*2); if(qr>m)ans+=query(m+1,r,o*2+1); return ans; } } struct node { int pos,val; bool friend operator <(node a,node b) { if(a.val==b.val) return a.pos>b.pos; return a.val>b.val; } }l[SIZE]; LL f[SIZE*10]; int main() { int n; f[0]=0; FOR(i,1,SIZE) f[i]=f[i-1]+i; while(~sf("%d",&n)) { CLR(t,0); FOR(i,1,n+1) { sf("%d",&l[i].val); l[i].pos=i; } sort(l+1,l+n+1); LL ans=0; FOR(i,1,n+1) { us=l[i].pos; update(1,n,1); ql=1,qr=l[i].pos-1; int left=0; if(ql<=qr) left=query(1,n,1); ql=l[i].pos+1,qr=n; int right=0; if(ql<=qr) right=query(1,n,1); right=n-l[i].pos-right; ans+=f[left+right]; //pf("%d: %d %d\n",l[i].val,left,right); } pf("%I64d\n",ans); //%lld WA到死!!!! } }
原文地址:http://blog.csdn.net/dongshimou/article/details/43273671