动规、贪心
作者:互联网
#include<stdio.h>
const int MAXN = 12000;
int n, a[MAXN + 1], dp[MAXN + 1];
int MAX=1;
int longestNum(){
dp[1] = 1;
for (int i = 2; i <= n; i++) {
int flag=0;
int max=dp[1];
for(int j=1;j<i;j++) //add something here for computing dp[i]
{
if(a[i]>a[j]&&dp[j]>=max)//要找到j<i且dp[j]最大的j值,一个等于号引发的血案
{
max=dp[j];
flag=1;
}
//printf("%d",max);
}
dp[i]=max+1;
if(flag==0)
dp[i]=1;
}
for(int i=1;i<=n;i++)//add something here for computing the final answer and return it.
{//Note: the final answer equals max{dp[1],dp[2],...,dp[n]}
if(dp[i]>MAX)
MAX=dp[i];
}
return MAX;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
printf("%d", longestNum());
return 0;
}
#include<stdio.h>
const int Maxn = 100;
const int MaxConsume = 200;
int n, r[Maxn + 1], p[Maxn + 1];
//任务i 只能在时刻 ri 后开始处理。任务i 需要 pi个时间单位才能完成,pi存储的是该任务剩余的时间。
int taskProcess() {
int cnt = 0, t = 0, tasknum = n;
while (tasknum) {
int min = MaxConsume + 1, j;//min是干什么用的?标记最小的p[i]的值
//The following loop finds the task j with the earliest possible finishing time among those who can be processed now.
for (int i = 1; i <= n; i++) {
if (t >= r[i] && p[i] > 0 && p[i] < min) //注意各个循环的范围
//if(p[i]<min) //add something here,找出能最快完成的赋值为j ,p[j]是最快完成的
{
min=p[i];
j=i;
}
}
//printf("%d ",j);
p[j]--; t++; //process task j in the current time unit.
if (p[j] == 0){
cnt+=t; //add something here. 完成了一个cnt要+当前的时间
tasknum--; //Hint: Update cnt and tasknum
}
}
return cnt;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &r[i]);//注意都是从1开始的
for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
printf("%d", taskProcess());
return 0;
}
标签:cnt,tasknum,min,int,max,动规,dp,贪心 来源: https://blog.csdn.net/weixin_52755699/article/details/117631074