1 条题解
-
0
C++ :
#include<stdio.h> #include<string.h> #include<ctime> #include<vector> #include<algorithm> using namespace std; #define N 1000000000 inline vector<int> change(int val) { vector<int>ans; while(val) { ans.push_back(val%N); val/=N; } return ans; } inline vector<int> equ(vector<int> a) { vector<int>ans; for(int i=0;i<a.size();i++) ans.push_back(a[i]); return ans; } inline vector<int> Min(vector<int> a,vector<int> b) { if(a.size()>b.size()) return b; else if(a.size()<b.size()) return a; else { for(int i=a.size()-1;i>=0;i--) { if(a[i]<b[i]) return a; else if(a[i]>b[i]) return b; } return a; } } inline vector<int> add(vector<int>a,vector<int>b) { vector<int>ans; int l1=a.size(),l2=b.size(),l=0; int m=0; while(l<min(l1,l2)) { int p=a[l]+b[l]+m; m=p/N; ans.push_back(p%N); l++; } while(l<l1) { int p=a[l]+m; m=p/N; ans.push_back(p%N); l++; } while(l<l2) { int p=b[l]+m; m=p/N; ans.push_back(p%N); l++; } if(m!=0) ans.push_back(m); return ans; } inline void Print(vector<int> a) { for(int i=a.size()-1;i>=0;i--) { printf("%d",a[i]); } printf("\n"); } vector<int>dp[21][1001]; inline void init() { for(int i=3;i<=20;i++) dp[i][1].push_back(1); for(int i=3;i<=20;i++) dp[i][2].push_back(3); for(int i=3;i<=1000;i++) { dp[3][i]=add(dp[3][1],add(dp[3][i-1],dp[3][i-1]));//dp[3][1]); } for(int i=4;i<=20;i++) for(int j=3;j<=1000;j++) { dp[i][j]=add(dp[i-1][1],add(dp[i][j-1],dp[i][j-1]));//,dp[i-1][1]); for(int k=2;k<=j;k++) { dp[i][j]=Min(dp[i][j],add(dp[i-1][k],add(dp[i][j-k],dp[i][j-k])));//dp[i-1][k])); } } } int main() { int m,n; init(); //printf("zz\n"); while(~scanf("%d%d",&m,&n)) { if(n==0) printf("0\n"); else Print(dp[m][n]); } }
Java :
import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class Main { public static BigInteger min(BigInteger a,BigInteger b) { if(a.compareTo(b)<0) return a; return b; } public static void main(String args[]) { Scanner cin=new Scanner(System.in); int maxn=1100; BigInteger dp[][]=new BigInteger[21][maxn]; for(int i=0;i<maxn;i++) { dp[2][i]=BigInteger.ZERO; dp[3][i]=BigInteger.valueOf(2).pow(i).subtract(BigInteger.ONE); } dp[2][1]=BigInteger.ONE; for(int i=4;i<21;i++) { dp[i][0]=BigInteger.ZERO; for(int j=1;j<maxn;j++) { dp[i][j]=dp[i-1][j]; for(int k=0;k<=j;k++) dp[i][j]=min(dp[i][j],dp[i][j-k].multiply(BigInteger.valueOf(2)).add(dp[i-1][k])); } } while(cin.hasNext()) { int m=cin.nextInt(); int n=cin.nextInt(); System.out.println(dp[m][n]); } } }
- 1
信息
- ID
- 2742
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者