SGU 269. Rooks(DP)

题意:

  给n(<=250)条水平网格,然后在上面放k棋子,每行每列都只能放一个。求方法总数。

Solution:

  简单的DP,

只要对给出的水平长度排个序就很容易处理了。

  需要用到高精度。

偷懒用java写了

import java.util.*;
import java.math.*;
public class Solution {
    public static void main(String[] args){
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt(),k=cin.nextInt();
        int[] a=new int[300];
        BigInteger[][] dp=new BigInteger[300][300];
        for(int i=1;i<=n;++i){
            a[i]=cin.nextInt();
        }
        Arrays.sort(a,1,n+1);
        for(int i=0;i<=250;++i)
            for(int j=0;j<=250;++j)
                dp[i][j]=BigInteger.ZERO;

        dp[0][0]=BigInteger.ONE;
        for(int i=1;i<=n;++i){
            dp[i][0]=dp[i-1][0];
            for(int j=1;j<=i;++j){
                dp[i][j]=dp[i-1][j].add(dp[i-1][j-1].multiply(BigInteger.valueOf(a[i]-j+1)));
            }
        }
        System.out.println(dp[n][k]);
    }
}

时间: 2024-10-05 04:27:31

SGU 269. Rooks(DP)的相关文章

Lightoj 1005 Rooks(DP)

A rook is a piece used in the game of chess which is played on a board of square grids. A rook can only move vertically or horizontally from its current position and two rooks attack each other if one is on the path of the other. In the following fig

(light OJ 1005) Rooks dp

http://www.lightoj.com/volume_showproblem.php?problem=1005    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 32 MB A rook is a piece used in the game of chess which is played on a board of square grids. A rook can only move vert

SGU 149 树形DP Computer Network

这道题搜了一晚上的题解,外加自己想了半个早上,终于想得很透彻了.于是打算好好写一写这题题解,而且这种做法比网上大多数题解要简单而且代码也比较简洁. 首先要把题读懂,把输入读懂,这实际上是一颗有向树.第i(2≤i≤n)行的两个数u,d,其中u是i的父亲结点,d是距离. 第一遍DFS我们可以计算出以u为根的子树中,距离u最远的结点的距离d(u, 0)以及次远的距离d(u, 1).而且,这两个不在u的同一棵子树中,如果u只有一个孩子,那么d(u, 1) = 0 第一遍DFS完以后,因为1是整棵树的跟,

【SGU 390】Tickets (数位DP)

Tickets Description Conductor is quite a boring profession, as all you have to do is just to sell tickets to the passengers. So no wonder that once upon a time in a faraway galaxy one conductor decided to diversify this occupation. Now this conductor

树形DP求树的重心 --SGU 134

令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心的属性值. 考虑用树形DP. dp[u]表示割去u点,得到的连通分支的节点数的最大值. tot[u]记录以u为根的这棵子树的节点数总和(包括根). 则用一次dfs即可预处理出这两个数组.再枚举每个点,每个点的属性值其实为max(dp[u],n-tot[u]),因为有可能最大的连通分支在u的父亲及以上

SGU 495 Kids and Prizes 概率DP 或 数学推理

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 有n个箱子 m个人 有两个思考的角度 1.从箱子的角度 对于一个箱子来说 不被选中的概率是((n-1)/n)^m 所以被选中的概率是(1 - ((n-1)/n)^m) 箱子之间是互相独立的 所以总期望是:n * (1 - ((n-1)/n)^m) [我是算样例然后无意中发现的规律 再证明] 2.从人的角度 从题目中看 人是one by one进去选的 所以可以看作有先后顺序 考虑动态

SGU - 134 Centroid 无根树转有根树 + 树形DP

题目大意:给出一个无向图(树),要求你删除掉其中一个点,使剩下的点构成的子树中,节点数最大的那个值达到最小 解题思路:因为给出的是一个无根树,第一个想法就是先把它转成有根树,将1当成根 设sum[i]为以i为根节点的子树有多少个节点,那么sum[1] - sum[i]就相当于是排除了i的所有子节点的另一棵子树的节点总数了 设dp[i]为去掉了i节点后的剩余节点所构成的子树的节点的最大值 那么dp[i] = max(dp[i], sum[son]) son指的是和i相连的子节点 还有另一棵子树,就

SGU 407 Number of Paths in the Empire dp+java大数

SGU 407 407. Number of Paths in the Empire Time limit per test: 0.75 second(s) Memory limit: 65536 kilobytes input: standard output: standard During the period of Tsam dynasty ruling people rarely fought against each other and their neighbours, becau

sgu 143 Long live the Queen 简单树形dp

// sgu 143  Long live the Queen 简单树形dp // // 题意:在树上选一个连通字图,使得节点的权值之和最大 // f[i] 表示以该节点为根的字图权值之和的最大值 // 则有 f[i] = w[i] + sigma(max(0,f[j])) i是j的父节点 // 最后在所有的f中挑个最大值就是答案.... #include <algorithm> #include <bitset> #include <cassert> #include