A-Dynasty Puzzles
题目意思说:有一个王朝,他们国王的名字用姓氏的简写来标记每一代。为了保证王朝的稳定,现在这个王朝的继承人的名字需要满足继承者名字的第一个字母要和前代名字最后一个字母相同。然后拼接起来的名字,第一个字母和最后一个字母相同。现在有一个考古博士,知道了这个王朝国王和亲戚的名字。问你这个王朝所能够得到的最长字符串。
设DP[i][j]表示字符串的首字母是i,尾字母是j。dp[j][v]=max(dp[j][v],dp[j][u]+len)(此时字符串a的首字母是u,尾字母是v)当前表示之前的串(j,u)加上了当前串(u,v)的长度是否大于(j,v)串的长度,如果大于,更新状态
#include<bits/stdc++.h>
using namespace std;
int dp[30][30];
int main()
{
int n;
string s;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s;
int st=s[0]-'a';
int ed=s[s.size()-1]-'a';
int len=s.size();
for(int j=0;j<26;j++)
{
if(dp[j][st])dp[j][ed]=max(dp[j][ed],dp[j][st]+len);
}
dp[st][ed]=max(len,dp[st][ed]);
}
int ans=0;
for(int i=0;i<26;i++)
{
ans=max(ans,dp[i][i]);
}
cout<<ans<<endl;
return 0;
}
B-Demonstration
题目题意:题目给了我们n个广场,反叛者的活动天数K,政府的总经济b,给了我们n个广场每次租用的花费(其中广场的下标是距离中心城区的远近,下标越小越近),我们需要输出的是反叛者可以租到的距离中心最近的广场的下标。每一天的活动如下:反叛者可以租用一个没有被政府使用过的广场。政府为了避免反叛者租到距离中心近的广场,会花钱使用它(干别的),这样政府就有借口不借了,但是如果反叛军租用最后一个(当然是最差的),政府不会花钱使用它的。政府如果没有钱使用它,那么反叛军就租用成功了,(当然反叛军也可以不使用它,只要他们还有时间)我们把前面n-1个广场排个序,费用高的在前面,然后累加前面k-1个广场,然后再遍历一遍n个广场。
首先我们可以想到的是,为了在k天内选到最靠前的城市,我们要想办法在前k-1天挑选尽可能贵的城市,为第k天奠定基础。
先对前n-1个城市的举办活动价值排序,对前k-1大的求和得到sum,接下来:
<1>sum>=0,则不论前k-1天选择多么贵的城市,第k天都无法找到一个城市花光政府的钱,那么只能选择最差的城市
<2>sum<0,按序号由小到大判断该城市是否包含在sum中或者将sum的第一项替换为该城市后sum仍小于0,如果满足条件,则该城市则为最优解
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long int ll;
int a[maxn],b[maxn];
ll sum;
bool cnm(int a,int b){
return a>b;}
int main()
{
int n,k;
ll t;
cin>>n>>k>>t;
for(int i=1;i<=n;i++){
cin>>a[i];b[i]=a[i];}
sort(b+1,b+n,cnm);
for(int i=1;i<k;i++)sum+=b[i];
for(int i=1;i<n;i++)
{
if(a[i]>b[k])
{