题目名称:小股炒股
题目描述
已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益是?
输入描述:
第一行输入整数n,m。(1<=n<=1000,1<=m<=10000) 第二行输入n个整数表示某股票单股价格p。(1<=p<=1000)
输出描述:
输出小最大收益
示例
输入
2 4
3 7
输出
8
假设第一天买入,如果后一天比较前一天高,计算利润,否则重置买入值
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b) {
return a>b?a:b;
}
//计算利润
//成本,买入,卖出
int count(int m,int a,int b) {
int n=m/a;
return m-n*a+b*n;
}
void solution(int n, int m, int plist[]) {
int p=plist[0];
int s=m;
for (int i=1;i<n;i++) {
if(plist[i]>p) {
int t=count(m,p,plist[i]);
s=max(t,s);
} else {
p=plist[i];
}
}
printf("%d",s);
}
int main() {
int tem_arr[2];
for (int i = 0; i < 2; i++) {
scanf("%d", &tem_arr[i]);
}
int n = tem_arr[0];
int m = tem_arr[1];
int* plist;
plist = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &plist[i]);
}
solution(n, m, plist);
return 0;
}
题目名称:最长回文串(动态规划)
题目描述
找出最长回文串 (“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串)(测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:
输入一行小写字母组成的字符串。
输出描述:
输出最先出现的最长回文串。
示例
输入 babad
输出 bab
用数组保持i~j是否是回文数
判断i-j是否是回文,判断s[i],s[j]是否相等,并且(i+1)~(j-1)是否是回文
从长度1,2,3…依次判断
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int ret[1024][1024]= {
0
}
;
void solution(char*str) {
int len=strlen(str);
int l=0;
int r=0;
for (int i=0;i<len;i++) {
ret[i][i]=1;
if(str[i]==str[i+1]&&(i+1)<len) {
ret[i][i+1]=2;
ret[i+1][i]=2;
if(l==0&&r==0) {
l=i;
r=i+1;
}
}
}
//从长度3开始判断
for (int i=3;i<=len;i++) {
int bFirst=1;
for (int j=0;j<=len-i;j++) {
//中间是回文数,并且2边相等
//printf("len:%d l:%d r:%d ret:%d\n",i,j,j+i-1,ret[j+1][j+i-2]);
if(str[j]==str[j+i-1] && ret[j+1][j+i-2]>0) {
ret[j][j+i-1]=i;
if(bFirst) {
l=j;
r=j+i-1;
bFirst=0;
//printf("len:%d %d %d\n",i,l,r);
}
}
}
}
str[r+1]=0;
printf("%s",str+l);
}
int main() {
char str[1024];
scanf("%s", str);
solution(str);
return 0;
}
题目名称:选择客栈(动态规划递归)
题目描述
丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。 两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。 他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。
输入描述:
共n+1 行。 第一行三个整数 n ,k ,p ,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值; 接下来的 n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和 i 号客栈的咖啡店的最低消费。
输出描述:
一个整数,表示可选的住宿方案的总数。
示例
输入
5 2 3
0 5
1 3
0 2
1 4
1 5
输出
3
做过多次的老题目了,当发现一个满足条件的点后开始统计,
左侧跟右侧同装饰的个数相乘,如果自己也是就要加上左右的数量
这里需要全局统计下装饰数,
下一次就是从下一个从新开始统计,类似递归
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int*klist=NULL;
int*klook=NULL;
int s=0;
void check(int n, int k, int p, int (*arr)[2]) {
for (int i=0;i<n;i++) {
int ki=arr[i][0];
int pi=arr[i][1];
klist[ki]--;
if(pi<=p) {
for (int j=0;j<k;j++) {
s=s+klist[j]*klook[j];
}
s=s+klist[ki]+klook[ki];
memset(klook,0,sizeof(int)*k);
check(n-i-1,k,p,arr+i+1);
break;
} else {
klook[ki]++;
}
}
}
void solution(int n, int k, int p, int (*arr)[2]) {
klist=(int*)malloc(sizeof(int)*k);
klook=(int*)malloc(sizeof(int)*k);
memset(klist,0,sizeof(int)*k);
memset(klook,0,sizeof(int)*k);
for (int i=0;i<n;i++) {
int ki=arr[i][0];
klist[ki]++;
}
check(n,k,p,arr);
printf("%d",s);
}
int main() {
int temp_arr[3];
for (int i = 0; i < 3; i++) {
scanf("%d", &temp_arr[i]);
}
int n = temp_arr[0];
int k = temp_arr[1];
int p = temp_arr[2];
int (*arr)[2];
arr = (int(*)[2])malloc(n * sizeof(int*));
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2; j++) {
scanf("%d", &arr[i][j]);
}
}
solution(n, k, p, arr);
return 0;
}