HDU5568/BestCoder Round #63 (div.2) B.sequence2 dp+高精度
sequence2
P.S. A subsequence bai(1≤i≤k) is an increasing subsequence of sequence bi(1≤i≤n) if and only if 1≤a1<a2<...<ak≤n and ba1<ba2<...<bak.
Two sequences ai and bi is exactly different if and only if there exist at least one i and ai≠bi.
For each cases, first come 2 integers, n,k(1≤n≤100,1≤k≤n)
Then follows n integers ai(0≤ai≤109)
1 2 2
3 2
1 2 3
3
//
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <bitset>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0) const int inf=~0u>>;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
//************************************************************************************** #define MAX_L 405 //最大长度,可以修改 class bign
{
public:
int len, s[MAX_L];//数的长度,记录数组
//构造函数
bign();
bign(const char*);
bign(int);
bool sign;//符号 1正数 0负数
string toStr() const;//转化为字符串,主要是便于输出
friend istream& operator>>(istream &,bign &);//重载输入流
friend ostream& operator<<(ostream &,bign &);//重载输出流
//重载复制
bign operator=(const char*);
bign operator=(int);
bign operator=(const string);
//重载各种比较
bool operator>(const bign &) const;
bool operator>=(const bign &) const;
bool operator<(const bign &) const;
bool operator<=(const bign &) const;
bool operator==(const bign &) const;
bool operator!=(const bign &) const;
//重载四则运算
bign operator+(const bign &) const;
bign operator++();
bign operator++(int);
bign operator+=(const bign&);
bign operator-(const bign &) const;
bign operator--();
bign operator--(int);
bign operator-=(const bign&);
bign operator*(const bign &)const;
bign operator*(const int num)const;
bign operator*=(const bign&);
bign operator/(const bign&)const;
bign operator/=(const bign&);
//四则运算的衍生运算
bign operator%(const bign&)const;//取模(余数)
bign factorial()const;//阶乘
bign Sqrt()const;//整数开根(向下取整)
bign pow(const bign&)const;//次方
//一些乱乱的函数
void clean();
~bign();
};
#define max(a,b) a>b ? a : b
#define min(a,b) a<b ? a : b bign::bign()
{
memset(s, , sizeof(s));
len = ;
sign = ;
} bign::bign(const char *num)
{
*this = num;
} bign::bign(int num)
{
*this = num;
} string bign::toStr() const
{
string res;
res = "";
for (int i = ; i < len; i++)
res = (char)(s[i] + '') + res;
if (res == "")
res = "";
if (!sign&&res != "")
res = "-" + res;
return res;
} istream &operator>>(istream &in, bign &num)
{
string str;
in>>str;
num=str;
return in;
} ostream &operator<<(ostream &out, bign &num)
{
out<<num.toStr();
return out;
} bign bign::operator=(const char *num)
{
memset(s, , sizeof(s));
char a[MAX_L] = "";
if (num[] != '-')
strcpy(a, num);
else
for (int i = ; i < strlen(num); i++)
a[i - ] = num[i];
sign = !(num[] == '-');
len = strlen(a);
for (int i = ; i < strlen(a); i++)
s[i] = a[len - i - ] - ;
return *this;
} bign bign::operator=(int num)
{
char temp[MAX_L];
sprintf(temp, "%d", num);
*this = temp;
return *this;
} bign bign::operator=(const string num)
{
const char *tmp;
tmp = num.c_str();
*this = tmp;
return *this;
} bool bign::operator<(const bign &num) const
{
if (sign^num.sign)
return num.sign;
if (len != num.len)
return len < num.len;
for (int i = len - ; i >= ; i--)
if (s[i] != num.s[i])
return sign ? (s[i] < num.s[i]) : (!(s[i] < num.s[i]));
return !sign;
} bool bign::operator>(const bign&num)const
{
return num < *this;
} bool bign::operator<=(const bign&num)const
{
return !(*this>num);
} bool bign::operator>=(const bign&num)const
{
return !(*this<num);
} bool bign::operator!=(const bign&num)const
{
return *this > num || *this < num;
} bool bign::operator==(const bign&num)const
{
return !(num != *this);
} bign bign::operator+(const bign &num) const
{
if (sign^num.sign)
{
bign tmp = sign ? num : *this;
tmp.sign = ;
return sign ? *this - tmp : num - tmp;
}
bign result;
result.len = ;
int temp = ;
for (int i = ; temp || i < (max(len, num.len)); i++)
{
int t = s[i] + num.s[i] + temp;
result.s[result.len++] = t % ;
temp = t / ;
}
result.sign = sign;
return result;
} bign bign::operator++()
{
*this = *this + ;
return *this;
} bign bign::operator++(int)
{
bign old = *this;
++(*this);
return old;
} bign bign::operator+=(const bign &num)
{
*this = *this + num;
return *this;
} bign bign::operator-(const bign &num) const
{
bign b=num,a=*this;
if (!num.sign && !sign)
{
b.sign=;
a.sign=;
return b-a;
}
if (!b.sign)
{
b.sign=;
return a+b;
}
if (!a.sign)
{
a.sign=;
b=bign()-(a+b);
return b;
}
if (a<b)
{
bign c=(b-a);
c.sign=false;
return c;
}
bign result;
result.len = ;
for (int i = , g = ; i < a.len; i++)
{
int x = a.s[i] - g;
if (i < b.len) x -= b.s[i];
if (x >= ) g = ;
else
{
g = ;
x += ;
}
result.s[result.len++] = x;
}
result.clean();
return result;
} bign bign::operator * (const bign &num)const
{
bign result;
result.len = len + num.len; for (int i = ; i < len; i++)
for (int j = ; j < num.len; j++)
result.s[i + j] += s[i] * num.s[j]; for (int i = ; i < result.len; i++)
{
result.s[i + ] += result.s[i] / ;
result.s[i] %= ;
}
result.clean();
result.sign = !(sign^num.sign);
return result;
} bign bign::operator*(const int num)const
{
bign x = num;
bign z = *this;
return x*z;
}
bign bign::operator*=(const bign&num)
{
*this = *this * num;
return *this;
} bign bign::operator /(const bign&num)const
{
bign ans;
ans.len = len - num.len + ;
if (ans.len < )
{
ans.len = ;
return ans;
} bign divisor = *this, divid = num;
divisor.sign = divid.sign = ;
int k = ans.len - ;
int j = len - ;
while (k >= )
{
while (divisor.s[j] == ) j--;
if (k > j) k = j;
char z[MAX_L];
memset(z, , sizeof(z));
for (int i = j; i >= k; i--)
z[j - i] = divisor.s[i] + '';
bign dividend = z;
if (dividend < divid) { k--; continue; }
int key = ;
while (divid*key <= dividend) key++;
key--;
ans.s[k] = key;
bign temp = divid*key;
for (int i = ; i < k; i++)
temp = temp * ;
divisor = divisor - temp;
k--;
}
ans.clean();
ans.sign = !(sign^num.sign);
return ans;
} bign bign::operator/=(const bign&num)
{
*this = *this / num;
return *this;
} bign bign::operator%(const bign& num)const
{
bign a = *this, b = num;
a.sign = b.sign = ;
bign result, temp = a / b*b;
result = a - temp;
result.sign = sign;
return result;
} bign bign::pow(const bign& num)const
{
bign result = ;
for (bign i = ; i < num; i++)
result = result*(*this);
return result;
} bign bign::factorial()const
{
bign result = ;
for (bign i = ; i <= *this; i++)
result *= i;
return result;
} void bign::clean()
{
if (len == ) len++;
while (len > && s[len - ] == '\0')
len--;
} bign bign::Sqrt()const
{
if(*this<)return -;
if(*this<=)return *this;
bign l=,r=*this,mid;
while(r-l>)
{
mid=(l+r)/;
if(mid*mid>*this)
r=mid;
else
l=mid;
}
return l;
} bign::~bign()
{
} int a[];
bign dp[][];
int n,k;
int main()
{
while(cin>>n>>k)
{ for(int i=; i<=n; i++)
{
cin>>a[i];
}
bign aa=,bb=;
for(int i=;i<=n;i++) {
for(int j=;j<=k;j++) dp[i][j]=aa;
}
for(int i=;i<=n;i++)dp[i][]=bb;
for(int i=;i<=n;i++) {
for(int j=;j<i;j++) {
if(a[i]>a[j]) {
for(int kk=;kk<=k;kk++) {
dp[i][kk]+=dp[j][kk-];
}
}
}
}
bign ans;
ans=dp[][k];
for(int i=;i<=n;i++)ans+=dp[i][k];
cout<<ans<<endl;
} return ;
}
代码
HDU5568/BestCoder Round #63 (div.2) B.sequence2 dp+高精度的更多相关文章
- HDU5569/BestCoder Round #63 (div.2) C.matrix DP
matrix Problem Description Given a matrix with n rows and m columns ( n+m is an odd number ), at fir ...
- BestCoder Round #63 (div.2)
感觉有些无聊的比赛. A 暴力枚举下就行 B 简单的dp,但是wa了一发后就去先把C做了,然后发现如果输入的100个数,是如1,2,3,4,...,100,然后k=50,个数为c(100,50).果断 ...
- hdu5569 BestCoder Round #63 (div.2)
题意: 给你一个矩阵,要求从左上角走到右下角,走个的费用:a[1]*a[2] + a[3]*a[4] + ......+ a[2n-1]*a[2n] 思路: 果然不机智,自己把自己套路了 对于每个奇数 ...
- HDU5567/BestCoder Round #63 (div.2) A sequence1 水
sequence1 Given an array a with length n, could you tell me how many pairs (i,j) ( i < j ) for a ...
- BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)
Baby Ming and Weight lifting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- BestCoder Round #68 (div.2) tree(hdu 5606)
tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- BestCoder Round #11 (Div. 2) 题解
HDOJ5054 Alice and Bob Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu5635 BestCoder Round #74 (div.2)
LCP Array Accepts: 131 Submissions: 1352 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 13 ...
- hdu 5636 搜索 BestCoder Round #74 (div.2)
Shortest Path Accepts: 40 Submissions: 610 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: ...
随机推荐
- 通过FileWatcher,监听通过web上传的图片,并进行压缩
需求是这样的,通过web传输过来的图片,无论是JS上传,还是其他的上传方式,都需要生成2张缩略图,分别是用于商品列表的小图small,和用于分享的小图share.基于不同上传方式的不同需求,使用exe ...
- 制作越狱版本的ipa文件
1.新建项目,证书选择开发者自己创建的证书 2.编译项目,在工程左侧树形菜单中,找到Product,找到编译后的项目,邮件,找到.app文件路径. 3.将这个app文件拖入到iTunes,邮件点击图标 ...
- Integer对象
数字格式的字符串转成基本数据类型的方法: 1:将该字符串封装成了Integer对象,并调用对象的方法intValue(); 2:使用Integer.parseInt(numstring):不用建立对象 ...
- 怎样把php数组转换成字符串,php implode()
实例代码 一维数组转换成字符串代码! <?php $arr1=array("shu","zhu","1"); $c=implode(& ...
- SqlServer正在执行的sql语句
SELECT [Spid] = session_Id ,ecid ,[Database] = DB_NAME(sp.dbid) ,[User] = nt_username ,[Status] = er ...
- springmvc返回jsp源代码解决办法
url-pattern问题 spring用到forward("/WEB-INF/jsp/*.jsp")而forward当然是又要经过web.xml的映射的,然后,在URL匹配时, ...
- MySQL数据库远程连接开启方法
有时候需要远程连接mysql数据库,默认是不可以的,可以参考下面的方法,解决下. 1.登陆自己机器的MySQL数据库:mysql -uroot -p密码 设置root用户可以任意IP访问,代码如下(可 ...
- android手机配置hosts文件
Android设备测试服务器时,可能需要修改 hosts 文件指定域名到对应的 IP 地址.Android 是基于 Linux 的系统,与 Linux 类似,通过 hosts 文件来设置. 在 And ...
- 【BZOJ】【4004】【JLOI2015】装备购买
拟阵/贪心 题解戳这里:http://blog.csdn.net/popoqqq/article/details/45148309 思路: 裸拟阵…… 维护线性基,将武器按价格排序,从小到大塞进去,如 ...
- GameMap(类结构)(不断跟新)
暂时有个疑问为什么这些需要这么复杂的继承