HDU5568 sequence2(dp+大数)
2015-11-23 11:16
316 查看
题目链接
题意:给你n个数,找出长度是m的上升序列
解答:dp[i][j]:表示以I结尾的长度是j的个数,本题n<=100可以直接暴力转移。
转移是dp[ i ] [ j ] = sum(dp[k] [j-1 ] )(1< = k < i , a[ k ] < a [ i ] )
如果n比较大的话,可以使用树状数组优化转移,对于大数,就直接java搞起
题意:给你n个数,找出长度是m的上升序列
解答:dp[i][j]:表示以I结尾的长度是j的个数,本题n<=100可以直接暴力转移。
转移是dp[ i ] [ j ] = sum(dp[k] [j-1 ] )(1< = k < i , a[ k ] < a [ i ] )
如果n比较大的话,可以使用树状数组优化转移,对于大数,就直接java搞起
import java.util.Scanner; import java.math.BigInteger; public class Main { final static int maxn=1005; public static void main(String[] args) { BigInteger a[]=new BigInteger[maxn]; BigInteger dp[][]=new BigInteger[maxn][maxn]; Scanner cin=new Scanner(System.in); while(cin.hasNext()){ int n=cin.nextInt(); int m=cin.nextInt(); for(int i=0;i<=n;i++)for(int j=0;j<=n;j++){ if(j==1)dp[i][j]=BigInteger.ONE; else dp[i][j]=BigInteger.ZERO; } for(int i=1;i<=n;i++){ long tmp=cin.nextLong(); a[i]=BigInteger.valueOf(tmp); } for(int i=1;i<=n;i++){ for(int j=2;j<=m;j++){ for(int k=1;k<i;k++){ if(a[k].compareTo(a[i])<0){ dp[i][j]=dp[i][j].add(dp[k][j-1]); } } } } BigInteger ans=BigInteger.ZERO; for(int i=1;i<=n;i++){ ans=ans.add(dp[i][m]); } System.out.println(ans); } } }
相关文章推荐
- [leetcode] 51. N-Queens
- UITableView的删除、添加,dataPick的使用
- Kibana User Guide [4.2] » Visualize » Tile Maps
- arduino编译过程
- java后台jsp Request获取url信息的各种方法比较
- Android systemUI移植
- session.createQuery()与createSQLQuery()区别
- UIViewContentMode各类型效果
- UVA11775 Unique Story dp+二维树状数组优化
- Kibana User Guide [4.2] » Visualize » Pie Charts
- 加载UI
- Kibana User Guide [4.2] » Visualize » Metric
- Easyui combobox 源码修改模糊查询v=1.34
- Kibana User Guide [4.2] » Visualize » Markdown Widget
- android 解决volley中StringRequest返回乱码
- UIView中的坐标转换
- IOS UI 规范
- Android Build with Gradle and ProGuard : “The output jar must be specified after an input jar, or it
- Run Configuration error:broken configuration due to unavailable
- int, NSInteger, NSUInteger, NSNumber的区别